본문 바로가기

Servlet&JSP

Step04_Final (filter, login filter)

filter에서 요청을 가로채서 직접 응답할 수 있다.

 

 

EncodingFilter.java

요청 인코딩 필터

package test.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
// "/*" 이 프로젝트에 오는 모든 요청에 대해 필터링을 하겠다는 의미
// /Step04_Final/ 하위의 모든 요청
@WebFilter("/*")
public class EncodingFilter implements Filter{

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}
	/*
	 *  request 에 들어오는 참조값은 원래 HttpServletRequest 객체의 참조값이다.
	 *  response 에 들어오는 참조값은 원래 HttpServletResponse 객체의 참조값이다.
	 */
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//1. 만일 인코딩 설정이 되지 않았다면
		if(request.getCharacterEncoding()==null) {
			//POST 방식 전송했을때 한글 깨짐 방지
			request.setCharacterEncoding("utf-8");
		}
		//2. 요청의 흐름 이어가기
		chain.doFilter(request, response);
		
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}

}

 

destroy()

필터가 파괴될때 동작할 것을 준비한다. 잘 사용하지 않는다.

 

doFilter()

@WebFilter에 적어 놓은 요청 (예시에서는 모든 요청)이 올때마다 동작할 것을 준비한다.

 

init()

최초 호출될때 한번만 호출되는 메소드이다.

 

예시 필터에서는 요청 인코딩을 했다.

 

 

LoginFilter.java

로그인 없이 회원전용공간을 들어갈 경우 

package test.filter;

import java.io.IOException;
import java.net.URLEncoder;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/*
 *  [ 요청을 가로체서 중간에 원하는 작업을 할수 있는 필터 만들기 ]
 *  
 *  1. javax.servlet.Filter 인터페이스를 구현한다.
 *  2. 어떤 요청에 대해 필터링을 할것인지 맵핑한다.
 */

@WebFilter(urlPatterns = {"/private/*","/users/private/*","/file/private/*","/cafe/private/*"})
public class LoginFilter implements Filter{

	@Override
	public void destroy() {
		
	}
	//필터가 동작할때 자동으로 호출되는 메소드 
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		//1. 로그인된 클라이언트인지 확인한다.
		
		//부모 type 을 자식 type 으로 casting!
		HttpServletRequest req=(HttpServletRequest)request;
		//자식 type 을 이용해서 HttpSession 객체의 참조값을 얻어낸다.
		HttpSession session=req.getSession();
		//로그인된 아이디가 있는지 읽어와 본다.
		String id=(String)session.getAttribute("id");
		//만일 로그인 된 상태라면 
		if(id != null) {
			//2. 만일 로그인을 했으면 관여하지 않고 요청의 흐름을 이어간다.
			chain.doFilter(request, response);
		}else {
			/*
			 *  로그인 페이지로 강제 리다일렉트 됬다면 
			 *  로그인 성공후에 원래 가려던 목적지로 다시 보내야 하고
			 *  GET 방식 전송 파라미터가 있다면 파라미터 정보도 같이 가지고 갈수 있도록 해야한다.
			 */
			//원래 가려던 url 정보 읽어오기
			String url=req.getRequestURI();
			//GET 방식 전송 파라미터를 query 문자열로 읽어오기 ( a=xxx&b=xxx&c=xxx )
			String query=req.getQueryString();
			//특수 문자는 인코딩을 해야한다.
			String encodedUrl=null;
			if(query==null) {//전송 파라미터가 없다면 
				encodedUrl=URLEncoder.encode(url);
			}else {
				// 원래 목적지가 /test/xxx.jsp 라고 가정하면 아래와 같은 형식의 문자열을 만든다.
				// "/test/xxx.jsp?a=xxx&b=xxx ..."
				encodedUrl=URLEncoder.encode(url+"?"+query);
			}
			//3. 로그인을 하지 않았으면 로그인 폼으로 이동할수 있도록 리다일렉트 응답을 준다.
			String cPath=req.getContextPath();
			// ServletResponse type 을 HttpServletResponse type 으로 casting
			HttpServletResponse res=(HttpServletResponse)response;
			//리다일렉트 시킬때 원래 목적지 정보를 url 라는 파라미터 명으로 같이 보낸다.
			res.sendRedirect(cPath+"/users/loginform.jsp?url="+encodedUrl);
		}	
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		
	}

}

 

 

로그인 없이 회원전용공간을 들어갈 경우 loginform.jsp 로 이동시킨다. 이때 원래 목적지 정보를 url이라는 파라미터 명으로 같이 보낸다.

 

 

Step02_DB의 /member/delete.jsp 재구성

sendRedirect() 메소드를 한번 더 학습해보기 위해 기존 Step02_DB의 /member/delete.jsp를 가져와서 재구성해보자

 

기존 Step02_DB의 /member/delete.jsp

<%@page import="test.member.dao.MemberDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//1. get 방식 파라미터로 전달되는 삭제할 회원의 번호를 읽어온다.
	int num=Integer.parseInt(request.getParameter("num"));
	//2. DB 에서 해당 회원의 정보를 삭제한다
	boolean isSuccess=MemberDao.getInstance().delete(num);
	//3. 응답한다.
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/member/delete.jsp</title>
</head>
<body>
	<%if (isSuccess){%>
		<script>
			alert("삭제 했습니다.");
			location.href="list.jsp";
		</script>
	<%}else{ %>
		<script>
			alert("삭제 실패!");
			location.href="list.jsp";	
		</script>
	<%} %>
</body>
</html>

sendRedirect() 메소드활용 /member/delete2.jsp

<%@page import="test.member.dao.MemberDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//1. get 방식 파라미터로 전달되는 삭제할 회원의 번호를 읽어온다.
	int num=Integer.parseInt(request.getParameter("num"));
	//2. DB 에서 해당 회원의 정보를 삭제한다
	boolean isSuccess=MemberDao.getInstance().delete(num);
	//3. 응답한다.
	
	//컨텍스트 경로
	String cPath=request.getContextPath();
	//아래의 경로로 리다이렉트 이동 시킨다. (요청을 다시 하라고 강요)
	//리다이렉트로 이동시키는 것 자체가 응답이다.
	response.sendRedirect(cPath+"/member/list.jsp");
%>

/member/delete2.jsp - if else 추가

<%@page import="test.member.dao.MemberDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
   //1. get 방식 파라미터로 전달되는 삭제할 회원의 번호를 읽어온다.
   int num=Integer.parseInt(request.getParameter("num"));
   //2. DB 해서 해당 회원의 정보를 삭제한다
   boolean isSuccess=MemberDao.getInstance().delete(num);
   //3. 응답한다.
   
   //컨텍스트 경로
   String cPath=request.getContextPath();

   if(isSuccess){ 
   
      //아래의 경로로 리다일렉트 이동 시킨다. (요청을 다시 하라고 강요)
      //리다일렉트 이동시키는것 자체가 응답이다.
      response.sendRedirect(cPath+"/member/list.jsp");%>
   <%}else{ %>
   <!DOCTYPE html>
   <html>
   <head>
   <meta charset="UTF-8">
   <title>/member/delete.jsp</title>
   </head>
   <body>
      
      <script>
         alert("삭제 실패!");
         location.href="list.jsp";
      </script>
      
   </body>
   </html>
   <%} %>

'Servlet&JSP' 카테고리의 다른 글

QuantumDB Eclipse Plugin  (0) 2022.08.22
Step04_Final (file, 파일 업로드)  (0) 2022.08.22
Step04_Final (users, 회원가입, 로그인처리)  (0) 2022.08.22
Step04_Final (fetch)  (0) 2022.08.22
Step04_Final(jstl)  (0) 2022.08.21