@WebServlet("/auth/login")
public class LoginController extends HttpServlet{
private static final long serialVersionUID = 1L;
MemberDao memberDao;
@Override
public void init() {
memberDao = (MemberDao) this.getServletContext().getAttribute("memberDao");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
String email = request.getParameter("email");
String password = request.getParameter("password");
Member member = memberDao.findByEmailPassword(email, password);
if(member != null) {
HttpSession session = request.getSession(); // 요청한 클라이언트의 전용 HttpSession 보관소를 얻는다.
session.setAttribute("loginMember", member); // 로그인한 멤버 정보를 세션 보관소에 저장한다.
}
// 클라이언트에게 쿠키 보내기
// 쿠키 데이터는 문자열만 가능하다.
Cookie cookie = new Cookie("email", email); // 클라이언트 쪽에 저장할 쿠키 생성
if(request.getParameter("saveEmail") == null) {
//여기서 파라미터는 url 창을 말한다.
cookie.setMaxAge(0); // 클라이언트에게 해당 이름의 쿠키를 지우라고 명령한다.
} else {
// 쿠키에 지속 시간을 설정하지 않으면 웹 브라우저가 실행되는 동안만 유효하다.
// 만약 웹브라우저를 종료하더라도 쿠키를 유지하고 싶다면,
// 지속 시간을 설정해야한다.
cookie.setMaxAge(60 * 60 * 24 * 7); // 7일
}
response.addCookie(cookie); // 응답헤더에 쿠키를 포함시킨다.
request.setAttribute("member", member);
// Refresh
response.setContentType("text/html;charset=UTF-8");
request.getRequestDispatcher("/auth/loginResult.jsp").include(request, response);
} catch(Exception e) {
request.setAttribute("exception", e);
request.getRequestDispatcher("/error.jsp").forward(request, response);
}
}
}
<%@ page language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JWS</title>
</head>
<body>
<h1>지민이의 로그인!</h1>
<form action='login'>
<h2>지민이 로그인하기>o!</h2>
<table border = '1'>
<tr>
<th>이메일</th><td><input name='email' type='email' size='30' value="${cookie.email.value}"></td>
</tr>
<tr>
<th>암호</th><td><input name='password' type='password' size='20'></td>
</tr>
</table>
<input type="checkbox" name="saveEmail">이메일 저장<br>
<p>
<button type='submit'>로그인</button>
<a href='../'>취소</a>
</p>
</form>
</body>
</html>
클라이언트 저장소에 보관할 데이터
서버에서 쿠키를 다룰 때는 개발자의 코딩이 필요하다.
클라이언트에서 서버로부터 받은 쿠키는 웹 브라우저가 자동으로 처리한다.
클라이언트는 같은 폴더에 소속된 서블릿으로부터 받은 쿠키를, 같은 폴더에 소속된 서블릿을 요청할 때만 쿠키를 서버로 보낸다.
쿠키는 클라이언트 쪽에 저장되기 때문에 쉽게 노출된다. ⇒ 보안 데이터는 쿠키로 저장하면 안된다.
<table border = '1'>
<tr>
<th>이메일</th><td><input name='email' type='email' size='30' value="${cookie.email.value}"></td>
</tr>
<tr>
<th>암호</th><td><input name='password' type='password' size='20'></td>
</tr>
</table>
<input type="checkbox" name="saveEmail">이메일 저장<br>
<p>
<button type='submit'>로그인</button>
<a href='../'>취소</a>
@WebServlet("/board/add")
public class BoardAddController extends HttpServlet{
private static final long serialVersionUID = 1L;
BoardDao boardDao;
@Override
public void init() {
boardDao = (BoardDao) this.getServletContext().getAttribute("boardDao");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Board board = new Board();
board.setTitle(request.getParameter("title"));
board.setContent(request.getParameter("content"));
// 로그인 사용자 정보는 파라미터로 받아서는 안된다.
// 반드시 세션에서 꺼내 써야 한다.
// 왜? 그래야만 클라이언트가 다른 사용자 정보를 보낼 수 있기 때문이다.
Member loginMember = (Member)request.getSession().getAttribute("loginMember");
board.setWriter(loginMember);
if(boardDao.insert(board)==0) {
throw new Exception("게시글 등록 실패");
}
// Refresh
response.setContentType("text/html;charset=UTF-8");
request.getRequestDispatcher("/board/add.jsp").include(request, response);
// Redirect
// - client에게 콘텐트를 보내지 않는다.
// - 응답 상태 프로토콜
// response.sendRedirect("list");
} catch(Exception e) {
request.setAttribute("exception", e);
request.getRequestDispatcher("/error.jsp").forward(request, response);
}
}
}
com.bitcamp.board.controller.BoardUpdateController 클래스 변경
com.bitcamp.board.controller.BoardDeleteController 클래스 변경
BoardUpdateController 클래스
@WebServlet("/board/update")
public class BoardUpdateController extends HttpServlet {
private static final long serialVersionUID = 1L;
BoardDao boardDao;
@Override
public void init() {
boardDao = (BoardDao) this.getServletContext().getAttribute("boardDao");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Board board = new Board();
board.setNo(Integer.parseInt(request.getParameter("no")));
board.setTitle( request.getParameter("title"));
board.setContent( request.getParameter("content"));
Member loginMember = (Member) request.getSession().getAttribute("loginMember");
if (boardDao.findByNo(board.getNo()).getWriter().getNo() != loginMember.getNo()) {
throw new Exception("게시글 작성자가 아닙니다.");
}
if (boardDao.update(board) == 0) {
throw new Exception("게시글 변경 실패!");
}
response.setHeader("Refresh", "1;url=list"); // 응답 헤더에 refresh를 삽입한다.
response.setContentType("text/html;charset=UTF-8");
request.getRequestDispatcher("/board/update.jsp").include(request, response);
} catch (Exception e) {
request.setAttribute("exception", e);
request.getRequestDispatcher("/error.jsp").forward(request, response);
}
}
}
com.bitcamp.board.filter.LoginCheckFilter 클래스 생성
LoginCheckFilter class
@WebFilter("*")
public class LoginCheckFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 요청 URL을 통해 로그인 여부를 검사할 지 결정한다.
// 요청 URL은 HTTP 프로토콜과 관련된 값이다.
// ServletRequest 타입은 HTTP 프로토콜과 관련된 기능을 다룰 수 있는 메서드가 없다.
// ServletRequest 타입의 객체를 HttpServletRequest객체로 형변환 해야한다.
// 필터의 파라미터로 넘어오는 객체는 원래 HttpServletRequest 객체이기 때문에 형변환 할 수 있다.
// 즉, HTTP 프로토콜과 관련된 기능을 쓰고 싶다면,
// 원래 타입으로 형변환 한 다음에 사용하라!
HttpServletRequest httpRequest = (HttpServletRequest) request;
// 응답 기능에 대해서도 HTTP 관련 메서드를 사용하고 싶다면, 형변환 하라!
HttpServletResponse httpResponse = (HttpServletResponse) response;
// 요청 URL에서 서블릿 경로만 추출한다.
// 예) 요청 URL: http://localhost:8000/app/board/add?title=aaa&content=bbb
// 서블릿 경로: /board/add <== 웹 애플리케이션 경로는 뺀다.
String servletPath = httpRequest.getServletPath();
//System.out.println(servletPath);
// 콘텐트를 등록, 변경, 삭제하는 경우 로그인 여부를 확인한다.
if(servletPath.endsWith("add") || servletPath.endsWith("update") || servletPath.endsWith("delete") ) {
Member loginMember =(Member)httpRequest.getSession().getAttribute("loginMember");
if(loginMember == null) { // 로그인 하지 않았다면
httpResponse.sendRedirect(httpRequest.getContextPath() + "/auth/form.jsp");
return;
}
}
// 다음 필터를 실행한다.
// 다음으로 실행할 필터가 없다면, 원래 목적지인 서블릿이 실행될 것이다.
chain.doFilter(request, response);
}
}