home
자바
home

04. 로그인 로그아웃 기능 구현

menubar 부분.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="com.kh.member.model.vo.Member"%> <% //System.out.println(request.getContextPath()); => /jsp String contextPath = request.getContextPath(); Member loginUser = (Member)session.getAttribute("loginUser"); // 로그인 전 menubar.jsp 로딩시 : null // 로그인 성공 후 menubar.jsp 로딩시 : 로그인 성공한 회원의 정보가 담겨있는 Member객체 %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <style> #login-form, #user-info {float:right} #user-info a{ text-decoration: none; color: black; font-size: 12px; } .nav-area{background:rgb(175, 194, 230)} .menu{ display:table-cell; height: 50px; width: 150px; } .menu a{ text-decoration: none; color: rgb(247, 247, 247); font-size: 15px; font-weight: bold; display: block; width: 100%; height: 100%; line-height: 50px; } .menu a:hover{ background: darkgray; } </style> <body> <h1 align="center" style="color: rgb(179, 179, 179);">Conimal</h1> <div class="login-area"> <% if(loginUser == null) { %> <!--로그인전에 보이는 로그인폼--> <form id="login-form" action="<%= request.getContextPath() %>/login.me" method="post"> <table> <tr> <th>아이디 : </th> <td><input type="text" name="userId" required></td> </tr> <tr> <th>비밀번호 : </th> <td><input type="password" name="userPwd" required></td> </tr> <tr> <th colspan="2"> <button type="submit">로그인</button> <button type="button">회원가입</button> </th> </tr> </table> </form> <% } else { %> <!-- 로그인성공후 --> <div id="user-info"> <b><%= loginUser.getUserName() %></b>의 방문을 환영합니다. <br><br> <div align="center"> <a href="">마이페이지</a> <a href="<%= contextPath %>/logout.me">로그아웃</a> </div> </div> <% } %> </div> <br clear="both"> <br> <div class="nav-area" align="center"> <div class="menu"><a href="">HOME</a></div> <div class="menu"><a href="">공지사항</a></div> <div class="menu"><a href="">일반게시판</a></div> <div class="menu"><a href="">사진게시판</a></div> </div> </body> </html>
Java
복사
login 서블릿
package com.kh.member.controller; import java.io.IOException; import javax.servlet.RequestDispatcher; 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; import com.kh.member.model.service.MemberService; import com.kh.member.model.vo.Member; /** * Servlet implementation class LoginServlet */ @WebServlet("/login.me") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public LoginServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().append("Served at: ").append(request.getContextPath()); /* * < HttpServletRequest 객체와 HttpServletRespone 객체 > * - request : 서버로 요청할때의 정보들이 담겨있음 (요청시 전달값, 요청전송방식 등) * - response : 요청에 대해 응답할때 필요한 객체 * * < Get방식과 Post방식 차이 > * - Get방식 : 사용자가 입력한 값들이 url 노출 o / 데이터 길이제한 o / 대신 즐겨찾기 편리 * - Post방식 : 사용자가 입력한 값들이 url 노출 x / 데이터 길이제한 x / 대신 Timeout존재 */ // 1) 전달값에 한글이 있을 경우 인코딩 처리해야됨 (Post방식일 경우) request.setCharacterEncoding("UTF-8"); // 2) 요청시 전달값 (request의 parameter영역) 꺼내서 변수 또는 객체에 기록하기 // request.getParameter("키값") : String 밸류값 // request.getParameterValues("키값") : String[] 밸류값들 String userId = request.getParameter("userId"); String userPwd = request.getParameter("userPwd"); // 3) 해당 요청을 처리하는 서비스클래스의 메소드 호출 및 결과 받기 Member loginUser = new MemberService().loginMember(userId, userPwd); // 4) 처리된 결과를 가지고 사용자가 보게될 뷰 지정 후 포워딩 또는 url재요청 //System.out.println(loginUser); /* * * 응답 페이지에 전달할 값이 있을 경우 어딘가에 담아야됨!! (담아줄 수 있는 JSP Scope내장객체 4종류) * 1) application : application에 담은 데이터는 웹 애플리케이션 전역에서 다 꺼내 쓸 수 있음 * 2) session : session에 담은 데이터는 모든 jsp에 servlet에서 꺼내 쓸 수 있음 * 한 번 담은 데이터는 내가 직접 지우기 전까지, 서버가 멈추기 전까지, 브라우저가 종료되기 전까지 * 접근해서 꺼내 쓸 수 있음 * 3) request : request에 담은 데이터는 해당 request를 포워딩한 응답 jsp에서만 꺼내 쓸 수 있음 (일회성 느낌) * 4) page : 해당 jsp페이지에서만 꺼내 쓸 수 있음 * * 공통적으로 데이터를 담고자 한다면 .setAttribute("키", 밸류) * " 데이터를 꺼내고자 한다면 .getAttribute("키") * " 데이터를 지우고자 한다면 .removeAttribute("키") */ if(loginUser == null) { // 로그인 실패 => 에러페이지 응답 request.setAttribute("errorMsg", "로그인 실패했습니다."); // 응답 페이지 jsp에게 위임시 필요한 객체 (RequestDispatcher) // '응답 뷰 지정하는' 포워딩 방식 // 포워딩 방식 : 해당 경로로 선택된 뷰가 보여질 뿐 url은 절대 변경되지 않음 (요청했을때의 url이 여전히 남아있을 거임) RequestDispatcher view = request.getRequestDispatcher("views/common/errorPage.jsp"); view.forward(request, response); }else { // 로그인 성공 => index페이지 응답 // Servlet에서 JSP내장객체인 session에 접근하고자 한다면 우선 세션 객체를 얻어와야됨 HttpSession session = request.getSession(); session.setAttribute("loginUser", loginUser); // 1. 포워딩방식 *복붙해주세용 // 2. url 재요청방식 (sendRedirect 방식) => response.sendRedirect("요청할 url"); // localhost:8888/jsp response.sendRedirect("/jsp"); //response.sendRedirect(request.getContextPath()); } } }
Java
복사
3. logout 서블릿
package com.kh.member.controller; 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; /** * Servlet implementation class LogoutServlet */ @WebServlet("/logout.me") public class LogoutServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public LogoutServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 로그아웃 요청 처리 => session 만료시키기 == 세션을 무효화 시키기 request.getSession().invalidate(); // 응답페이지 => /jsp url 재요청 => index.jsp 페이지 //response.sendRedirect("/jsp"); response.sendRedirect(request.getContextPath()); // 경로 알아오는 메소드 !! 명시적으로 쓰지말고 이 메소드 쓰기 (협업할 때 특히 !) } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
Java
복사
4. MemberService
package com.kh.member.model.service; import java.sql.Connection; import com.kh.common.JDBCTemplate; import com.kh.member.model.dao.MemberDao; import com.kh.member.model.vo.Member; public class MemberService { /** * 로그인 요청 서비스 * @param userId 사용자가 입력했던 아이디값 * @param userPwd 사용자가 입력했던 비밀번호값 */ public Member loginMember(String userId, String userPwd) { Connection conn = JDBCTemplate.getConnection(); Member m = new MemberDao().loginMember(conn, userId, userPwd); JDBCTemplate.close(conn); return m; } }
Java
복사
5. MemberDao
package com.kh.member.model.dao; import java.io.FileInputStream; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; import com.kh.common.JDBCTemplate; import com.kh.member.model.vo.Member; public class MemberDao { private Properties prop = new Properties(); public MemberDao() { // WebContent파일 안의 WEB-INF/sql/member 경로에 있는 파일을 제시해야함 !!! // NullPointer 오류 발생 가능 ! => 경로 오타 확인 // 변수에 담지 않고 바로 FileInputStream안에 물리주소를 입력해도 된다. String fileName = MemberDao.class.getResource("/sql/member/member-mapper.xml").getPath(); try { prop.loadFromXML(new FileInputStream(fileName)); } catch (IOException e) { e.printStackTrace(); } } public Member loginMember(Connection conn, String userId, String userPwd) { // select문 => ResultSet 객체 (한 행) => Member객체 Member m = null; PreparedStatement pstmt = null; ResultSet rset = null; String sql = prop.getProperty("loginMember"); // NullPointer 에러 발생시 오타난것!! try { pstmt = conn.prepareStatement(sql); // 미완성된 sql문 pstmt.setString(1, userId); pstmt.setString(2, userPwd); rset = pstmt.executeQuery(); if(rset.next()) { m = new Member(rset.getInt("user_no"), rset.getString("user_no"), rset.getString("user_pwd"), rset.getString("user_name"), rset.getString("phone"), rset.getString("email"), rset.getString("address"), rset.getString("interest"), rset.getDate("enroll_date"), rset.getDate("modify_date"), rset.getString("status")); } } catch (SQLException e) { e.printStackTrace(); } finally { JDBCTemplate.close(rset); JDBCTemplate.close(pstmt); } return m; } }
Java
복사
member-mapper.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="loginMember"> SELECT USER_NO , USER_ID , USER_PWD , USER_NAME , PHONE , EMAIL , ADDRESS , INTEREST , ENROLL_DATE , MODIFY_DATE , STATUS FROM MEMBER WHERE USER_ID = ? AND USER_PWD = ? AND STATUS = 'Y' </entry> </properties>
XML
복사