26. Filter
필터(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>