WEB/JSP

26. Filter

choi121xx 2013. 4. 24. 00:04

필터(Filter)


- 클라이언트의 요청을 중간에 가로채서 요청페이지로 가기전에 특정작업을 수행함.

 수행후 요청페이지로 갈수 있고 필터에서 다른페이지로 이동도 가능하다.


- 만드는 방법

 Filter인터페이스를 상속받아 doFilter메소드에서 처리할 작업을 구현한다.

 web.xml 에 필터매핑을 설정한다.





EX1> 한글 encoding




web.xml

<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

  <display-name>day09_Filter</display-name>

  <welcome-file-list>

    <welcome-file>index.html</welcome-file>

  </welcome-file-list>

  <!-- //////////////// 필터 설정하기 ///////////////// -->

  <!-- 필터정의하기 -->

  <filter>

  <filter-name>encodingFilter</filter-name>

  <filter-class>test.filter.EncodingFilter</filter-class>

  <!-- 초기화 파라미터 설정하기 -->

  <init-param>

  <param-name>encoding</param-name>

  <param-value>euc-kr</param-value>

  </init-param>

  </filter>

  <!-- 필터매핑하기

    encodingFilter는 /하위 모든 페이지를 요청할때마다 자동 호출됨

   -->

  <filter-mapping>

  <filter-name>encodingFilter</filter-name>

  <url-pattern>/*</url-pattern>

  </filter-mapping>

  <!-- //////////////////////////////////////////////// -->

</web-app>



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;


public class EncodingFilter implements Filter {

private String encoding = null;

@Override

public void destroy() {

System.out.println("destory메소드 호출");

encoding=null;

}

//필터를 요청할때 마다 자동 호출됨.

//클라이언트의 요청을 가로채서 해야 할일을 구현

@Override

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

System.out.println("dofilter메소드 호출");

// 인코딩방식이 설정되어 있지 않은 경우

if(request.getCharacterEncoding()==null){

if(encoding!=null){

//인코딩 설정하기

request.setCharacterEncoding(encoding);

}

}

// 다음 필터 수행하기. 다음에 수행할 필터가 있으면 필터를 수행하고

// 더이상 수행할 필터가 없으면 사용자가 요청한 페이지로 이동한다.

chain.doFilter(request, response);

}

//최초로 필터가 요청될때 딱 한번만 호출되는 메소드

// doFilter 메소드가 수행되기 위한 준비작업, 초기화 작업

@Override

public void init(FilterConfig config) throws ServletException {

// TODO Auto-generated method stub

System.out.println("init메소드 호출");

//web.xml에 설정된 초기화 파라미터값(설정할 인코딩 방식) 얻어오기.

encoding=config.getInitParameter("encoding");

}

}



insert.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<form action="insertOk.jsp" method="post">

이름<input type="text" name="name"/><br/>

전화번호<input type="text" name="phone"/><br/>

주소<input type="text" name="address"/><br/>

<input type="submit" value="전송"/>

</form>

</body>

</html>



insertOk.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<%

String name=request.getParameter("name");

String phone=request.getParameter("phone");

String address=request.getParameter("address");

%>

</head>

<body>

<%=name %><br/>

<%=phone %><br/>

<%=address %><br/>

<hr/>

${ param.name }<br/>

${ param.phone }<br/>

${ param.address }<br/>

</body>

</html>







EX2> 로그아웃이 된 상태이면 회원질문게시판, 마이페이지로 이동하면 자동으로 로그인페이지로 이동하게 하는 예제

- 로그인 필터.( member밑에 모든 페이지를 호출할때마다 필터 적용 )

- 어노테이션 사용.





web.xml에 filter설정없이 어노테이션 사용. ( LoginFilter.java파일에)


 LoginFilter.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;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;


@WebFilter("/member/*")

public class LoginFilter implements Filter {


@Override

public void destroy() {

}


@Override

public void doFilter(ServletRequest req, ServletResponse resp,

FilterChain chain) throws IOException, ServletException {

//자식인 HttpServletRequest에 세션을 얻어오는 메소드가 있으므로 

// 자식으로 형변환 하기.

HttpServletRequest request = (HttpServletRequest)req;

//세션객체 얻어오기

HttpSession session = request.getSession();

boolean login=false; // 로그인 되었는지에 대한 상태

if(session!=null){

//세션에서 id꺼내오기(로그인한 사용자는 세션에 id가 저장되어 있음)

String id=(String)session.getAttribute("id");

if(id!=null){//로그인한 사용자 라면

login=true; // 로그인 상태를 true로 설정

}

}

if(login){//로그인한 경우

chain.doFilter(req, resp);

}else{//로그인안한 경우

HttpServletResponse response = (HttpServletResponse)resp;

response.sendRedirect(request.getContextPath() + "/login/login.jsp");

}

}


@Override

public void init(FilterConfig config) throws ServletException {

}

}


main.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<a href="login/login.jsp">로그인하기</a><br/>

<a href="member/board.jsp">회원질문게시판</a><br/>

<a href="member/mypage.jsp">마이페이지</a><br/>

</body>

</html>




login/login.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%

String cp=request.getContextPath();  

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<style type="text/css">

#msg{

font-size: 10pt;

color:red;

}

</style>

</head>

<body>

<form action="loginOk.jsp" method="post">

아이디:<input type="text" name="id"/><br/>

비밀번호:<input type="password" name="pwd"/><br/>

<div id="msg">${ requestScope.errMsg }</div>

<input type="submit" value="로그인"/>

<input type="reset" value="취소"/>

</form>

</body>

</html>


login/loginOk.jsp

; id: song   pwd: 1234 와 비교

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<%

String id=request.getParameter("id");

String pwd=request.getParameter("pwd");

if(id.equals("song") && pwd.equals("1234")){

session.setAttribute("id", id);

response.sendRedirect("../member/board.jsp");

}else{

%>

<script type="text/javascript">

alert("아이디 또는 비밀번호가 틀려요!");

history.go(-1);

</script>

<%

}

%>

</body>

</html>


login/logout.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<%

session.invalidate();

%>

로그아웃되셨습니다.<br/>

<a href="<%=request.getContextPath() %>/main.jsp">메인으로 이동</a>

</body>

</html>


member/board.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<div style="text-align:right;width:900px">

[${ id }]님 반갑습니다.

<a href="../login/logout.jsp">로그아웃</a>

<a href="../main.jsp">메인으로</a>

</div>

<h2>질문게시판</h2>

게시판 ~~

</body>

</html>


member/mypage.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<div style="text-align:right;width:900px">

[${ id }]님 반갑습니다.

<a href="logout.jsp">로그아웃</a>

<a href="../main.jsp">메인으로</a>

</div>

<h2>마이페이지</h2>

회원님.정보입니다.~~

</body>

</html>