본문 바로가기

HTML

240115 홈페이지 만들기

점점.. 블로그에 게시하기가 어려워짐

이래서 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