<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>filterTest</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<filter>
<display-name>Test1</display-name>
<filter-name>Test1</filter-name>
<filter-class>a.b.Test1</filter-class>
</filter>
<filter-mapping>
<filter-name>Test1</filter-name>
<url-pattern>/Test</url-pattern>
</filter-mapping>
<filter>
<display-name>Test2</display-name>
<filter-name>Test2</filter-name>
<filter-class>c.d.Test2</filter-class>
</filter>
<filter-mapping>
<filter-name>Test2</filter-name>
<url-pattern>/Test</url-pattern>
</filter-mapping>
<servlet>
<description></description>
<display-name>Test3</display-name>
<servlet-name>Test3</servlet-name>
<servlet-class>e.f.Test3</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Test3</servlet-name>
<url-pattern>/Test</url-pattern>
</servlet-mapping>
</web-app>
url-pattern 3군데에 같은 이름이 되어 있습니다. /Test
해당 url-pattern 에 걸린다면 servlet-class 가 순서대로 실행됩니다 -> 첫번째 필터의 doFilter() , 두번째필터의 doFilter() 서블릿의 doGet() 입니다.
첫번째 doFilter() 에서 chain.doFilter 메소드를 통해 두번째 doFilter가 실행됩니다
servlet 에 load-on-startup 이 양수면 톰캣 실행시 자동으로 init 메소드가 실행된다는걸 배웠습니다. filter 에도 init 메소드가 있는데, load-on-startup 없이 톰캣 켜진다면 자동으로 실행됩니다.
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
// pass the request along the filter chain
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse resp=(HttpServletResponse)response;
HttpSession session=req.getSession();
if(session.getAttribute("id")==null){
String context=req.getContextPath();
String path=context+"/loginForm.jsp";
resp.sendRedirect(path);
}else
chain.doFilter(request, response);
}
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<filter>
<display-name>LoginFilter</display-name>
<filter-name>LoginFilter</filter-name>
<filter-class>kr.co.seoulit.common.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/member/*</url-pattern>
</filter-mapping>
url 에 /member/ 아무글이나 적으면 filter-class 에서 LoginFilter 에 걸려서 LoginFilter.java 가 실행됩니다 -> doFilter 실행
초기값에 id 는 null 이기 때문에 페이지는 loginForm.jsp 로 이동됩니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<form action="login.jsp">
ID : <input type="text" name="id"><br/>
PW : <input type="text" name="pw">
<input type="reset" value="취소">
<input type="submit" value="로그인">
<font color="red"></font>
</form>
로그인화면에서 id랑 비번은 login.jsp 페러미터로 던집니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String id=request.getParameter("id");
String pw=request.getParameter("pw");
String path="loginForm.jsp";
if(id.equals(pw)){
session.setAttribute("id",id);
path="member/list.jsp";
}
response.sendRedirect(path);
%>
받은 id랑 비번이 맞다면 id 를 session 에 저장하고 페이지가 member/list.jsp 로 이동합니다
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String s=(String)session.getAttribute("id");
String s1="logout.jsp";
String s2="로그아웃";
if(s==null){
s2="로그인";
s1="loginForm.jsp";
}
%>
<a href="member/list.jsp">회원목록</a><br/>
<a href="board/list.jsp">게시판목록</a><br/>
<a href=<%=s1%>><%=s2%></a><br/>
만약 로그인 하지 않은채 회원목록을 누른다면 loginForm.jsp 로 자동이동합니다.
회원 목록을 누르면 LoginFilter 가 member/로 걸려 실행됩니다.
////////////////////
뉴렉처
필터
톰캣이 가지고 있는 server.xml 에서 가서
들어오는 인코딩을 utf-8로 바꾸면 됩니다
was 와 ServletContainer 중간에 갈아끼우는 소프트웨어를 둔다
was에서 요청이 오면 요녀석이 가로채기를 합니다
요녀석이 Servlet으로 요청을 보낼지 말지를 결정지을 수 있습니다.
접근 권한이 있는지 없는지도 검사합니다.
servletContainer에 준 기본적인 설정을 요녀석에게 한번만 설정하면
거쳐가면서 모두 ServletContainer 에 영향을 줄 있습니다.
요청이 실행되고 응답할때도 바로 was에 가지않고 요 녀석을 거쳐 갑니다
요녀석 = 필터
class 를 만드는데, loginFilter interface로 Filter 를 상속받으면
doFilter 는 오버라이딩 되어 받는다.
요청이 올때마다 실행이 되지만
톰캣이 한번 실행될때도 실행됩니다
doFilter 에 hello filter를 넣으면 요청때 한번 응답때 한번
총 2번 나옵니다, 이후 요청할때 마다 실행됩니다
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>패키지명.filter.클래스명</filter-class>
</filter>
<filter-mapping>
<filter-name>
characterEncodingFilter
</filter-name>
<url-pattern>/*</url-pattern>//모든 url 에서 이 필터가 적용되길 원한다
</filter-mapping>
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
필터에 걸렸고, 다음으로 넘어갈 것인지 아닌지는 filterChain이 결정합니다
filterChain.doFilter(request, response) //다음 필터 또는 Servlet이 실행되게 합니다
그 후에 돌아오게 되면 response 가 실행됩니다
System.out.println("before filter");
filterChain.doFilter(request,response);
System.out.println("after filter");
request.setCharacterEncoding("utf-8");
filterChain.doFilter(request,response);
이러면 servlet에 utf-8을 전달해줍니다