Filter

서울IT코드정리 /kyChoi·2021년 11월 9일
0

JSP 정리❤

목록 보기
20/22
<?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을 전달해줍니다
profile
건물주가 되는 그날까지

0개의 댓글