점점.. 블로그에 게시하기가 어려워짐
이래서 github 를 쓰는 듯
오늘은 로그아웃 서블릿을 만들고, 로그아웃을 눌렀을 때 처리하는 방법을 배움
로그아웃 Servlet
package com.poseidon.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/logout")
public class Logout extends HttpServlet {
private static final long serialVersionUID = 1L;
public Logout() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// response.getWriter().append("Served at: ").append(request.getContextPath());
System.out.println("Logout get");
/*
* 세션과 쿠키 세션 : 서버에 저장, 로그인 정보를 주로 저장
* 쿠키 : 클라이언트에 저장 (브라우저), 쇼핑정보, 장바구니, 방문내역 등
* 중요하지 않은 정보들
*/
// 세션 종료
HttpSession session = request.getSession();
// 최대 유효 시간을 초 단위로 설정
// session.setMaxInactiveInterval(3600);
if (session.getAttribute("mname") != null) {
// 최대 유효시간을 초 로 출력
System.out.println("세션 유효시간 : " + session.getMaxInactiveInterval());
System.out.println("mname : " + session.getAttribute("mname"));
// 세션에서 값 삭제
session.removeAttribute("mname");
}
if (session.getAttribute("mid") != null) {
System.out.println("mid : " + session.getAttribute("mid"));
session.removeAttribute("mid");
}
// 세션에서 모든 값 삭제, 세션 자체를 무효화하고 제거
// removeAttribute 는 현재 세션에서 특정 key-value 만 제거
// remove 할 경우 httpsession 인스턴스가 남아있어 invalidate 해주는 것이 좋음
session.invalidate();
// 다시 Login 으로 보내기
response.sendRedirect("./login");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// doGet(request, response);
System.out.println("Logout post");
}
}
로그인 세션의 여부에 따라
login logout 버튼 다르게 출력하기
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<link href="./css/menu.css" rel="stylesheet" />
<script type="text/javascript" src="./js/menu.js"></script>
<nav>
<ul>
<li onclick="url('./')">홈</li>
<li onclick="url('./board')">게시판</li>
<li onclick="url('./qna')">문의사항</li>
<li onclick="url('./notice')">공지</li>
<% if (session.getAttribute("mname") == null) { %>
<li onclick="url('./login')">로그인</li>
<% } else { %>
<li onclick="url('./logout')">로그아웃</li>
<% } %>
<li onclick="url('./info')">info</li>
</ul>
</nav>
jstl 문법으로 수정하기
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<link href="./css/menu.css" rel="stylesheet" />
<script type="text/javascript" src="./js/menu.js"></script>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<nav>
<ul>
<li onclick="url('./')">홈</li>
<li onclick="url('./board')">게시판</li>
<li onclick="url('./qna')">문의사항</li>
<li onclick="url('./notice')">공지</li>
<c:choose>
<c:when test="${sessionScope.mname eq null }">
<li onclick="url('./login')">로그인</li>
</c:when>
<c:otherwise>
<li onclick="url('./logout')">로그아웃</li>
</c:otherwise>
</c:choose>
<li onclick="url('./info')">info</li>
</ul>
</nav>
이제 write 를 쓸 때 로그인 한 사람만 가능하게 수정하기
세션에 아이디가 있을 경우에만 로그인 버튼이 뜨게 수정
<c:if test="${sessionScope.mname ne null }">
<button onclick="url('./write')">글쓰기</button>
${sessionScope.mname } 님 반갑습니다.
</c:if>
게시글 상세보기 수정하기, DAO 의 출력 값 수정
public BoardDTO detail(int no) {
BoardDTO dto = new BoardDTO();
Connection conn = DBConnection.getInstance().getConn();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "SELECT b.board_no, b.board_title, b.board_content, m.mname, m.mid,"
+ "b.board_date, b.board_count "
+ "FROM board b JOIN member m "
+ "ON b.mno = m.mno WHERE board_no=?";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, no);
rs = pstmt.executeQuery();
if (rs.next()) {
dto.setNo(rs.getInt("board_no"));
dto.setTitle(rs.getString("board_title"));
dto.setContent(rs.getString("board_content"));
dto.setDate(rs.getString("board_date"));
dto.setCount(rs.getInt("board_count"));
// dto.setWrite(rs.getString("board_write"));
dto.setWrite(rs.getString("mname"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(conn, pstmt, rs);
}
return dto;
}
write 에 mno 집어넣기
세션을 만들어서, 세션의 mid 값을 받음
HttpSession session = request.getSession();
if (session.getAttribute("mid") == null || session.getAttribute("mname") == null) {
response.sendRedirect("./login");
} else {
String title = request.getParameter("title");
String content = request.getParameter("content");
// int mno = Integer.parseInt(request.getParameter("mno"));
System.out.println(title);
System.out.println(content);
// DAO 에 write 메소드 만들기
BoardDTO dto = new BoardDTO();
dto.setTitle(title);
dto.setContent(content);
// dto.setMno(mno);
dto.setMid((String) session.getAttribute("mid"));
BoardDAO dao = new BoardDAO();
int result = dao.write(dto);
// 페이지 이동
if (result > 0) {
response.sendRedirect("./board");
} else {
response.sendRedirect("./error");
}
}
DAO 에서 로그인 한 사람의 mno 값을 받아 DB 에 값 집어넣기
서브쿼리를 사용하여 하기
public int write(BoardDTO dto) {
int result = 0;
Connection conn = dbConn.getConn();
PreparedStatement pstmt = null;
String sql = "INSERT INTO board (board_title, board_content, mno) "
+ "VALUES (?, ?, (SELECT mno FROM member WHERE mid=?))";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, dto.getTitle());
pstmt.setString(2, dto.getContent());
pstmt.setString(3, dto.getMid());
result = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
if 문으로 글쓰기 시에 로그인 여부 체크하기
게시판 페이지에서 로그인 한 사람만 글쓰기 버튼 뜨게 하기
<c:if test="${sessionScope.mname ne null }">
<button onclick="url('./write')">글쓰기</button>
${sessionScope.mname } 님 반갑습니다.
</c:if>
서블릿에서 로그인 되어 있는 것 한번 더 체크
if (session.getAttribute("mid") == null || session.getAttribute("mname") == null) {
'HTML' 카테고리의 다른 글
240118 홈페이지 만들기 (0) | 2024.01.18 |
---|---|
240116 HTML, Servlet 홈페이지 (0) | 2024.01.16 |
240112 HTML 홈페이지 만들기 (0) | 2024.01.12 |
240109 HTML (0) | 2024.01.09 |
240108 (0) | 2024.01.08 |