
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 |