Filter responseWrapper
로그인 검사 필터
session에 "MEMBER" 속성이 존재하면 로그인한 것으로 판단하는 로그인 필터 클래스 작성
- 예시입니다.
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public class LoginCheckFilter implements Filter{
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpSession session = httpRequest.getSession(false);
boolean login = false;
if(session != null){
if(session.getAttribute("MEMBER") != null){
login = true;
}
}
if(login){
chain.doFilter(request, response);
}else{
RequestDispatcher dispatcher = request.getRequestDispatcher(request, response);
}
}
public void destory(){
}
}
=> 로그인 검사 필터는 로그인을 한 상태라면 필터 체인의 다음 필터로 이동하고 로그인 하지 않은 상태로 판단되면 로그인 페이지로 이동됩니다.
- web.xml 작성법
<?xml version="1.0" encoding="euc-kr"?>
<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_2_5.xsd"
version="2.5">
<filter>
<filter-name>LoginCheck</filter-name>
<filter-class>kame.chap21.filter.LoginCheckFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginCheck</filter-name>
<url-pattern>/board/*</url-pattern>
</filter-mapping>
<filter>
</web-app>
=> web.xml 파일의 설정에 따라 /board/* 에 해당하는 요청을 보내면 LoginCheckfilter가 동작되고, session에 "MEMBER"속성이 존재하지 않으면 /loginForm.jsp로 포워딩 하게 됩니다.
- XSL/T 필터
XSL/T 필터는 응답 데이터를 변경해 주는 필터이다. 서블릿/JSP가 생성한 XML 문서를 XSL/T를 이용하여 완전히 새로운 형태로 재구성하는 것이 XSL/T 필터의 역할이다. 이를 위해 먼저 ①버퍼의 역할을 할 출력 스트림을 작성해야 하며, 또한 그 출력 스트림은 서블릿과 JSP에서 주로 사용되는 printWriter 타입이어야 합니다.
서블릿 /JSP가 추력하는 데이터를 저장해둘 버퍼의 역할을 하는 클래스
import java.io.PrintWriter;
import java.io.StringWriter;
public class ResponseBufferWriter extends PrintWriter {
public ResponseBufferWriter(){
super(new StringWriter(4096));
}
public String toString() {
return ((StringWriter) super.out).toString();
}
}
=> ResponseBufferWriter는 print(), println(), wirte() 등의 메서드를 통해서 전달된 데이터를 StringWriter에 저장하며, toString() 메서드는 StringWriter에 저장된 데이터를 String타입으로 변환해 주는 역할을 합니다.
- 출력 버퍼를 만든 후 ②서블릿과 JSP가 ResponseBufferWriter를 출력 스트림으로 사용하도록 응답 래퍼 클래스를 작성해야 합니다.
mport java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class XSLTResponseWrapper extends HttpServletResponseWrapper {
private ResponseBufferWriter buffer = null;
public XSLTResponseWrapper(HttpServletResponse response) {
super(response);
buffer = new ResponseBufferWriter();
}
//JSP/서블릿은 ServletResponse의 getWriter() 메서드를 통해서 구한 출력 스트림에 데이터를 출력하게 됩니다. XSTLResponseWrapper는 getWriter() 메서드에서 ResponseBufferWriter 객체를 리턴함으로써 JSP의 출력 결과가 버퍼에 저장되도록 합니다.
public PrintWriter getWriter() throws java.io.IOException {
return buffer;
}
//setContentType 메서드는 아무 기능을 하지 않는데, 이렇게 한 이유는 JSP/서블릿에서 설정한 콘텐트 타입을 무시하고 필터에서 새롭게 콘텐트 타입을 지정하도록 하기 위함입니다.
public void setContentType(String contentType) {
// do nothing
}
//버퍼에 저장된 내용, 즉 JSP나 서블릿이 생성한 내용을 리턴합니다.
public String getBufferedString() {
return buffer.toString();
}
}
다음으로 ③ 4단계에 걸쳐 필터를 구현해야 합니다.
* 응답 래퍼(XSLTResponseWrapper)를 생성합니다.
* 생성한 응답 래퍼를 체인의 다음 필터에 전달합니다.
* 래퍼로부터 서블릿/JSP가 출력한 데이터를 읽어와 XSL/T를 사용하여 HTML로 변환 합니다.
* 변환된 결과인 HTML을 실제 응답 스트림에 출력합니다.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
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.http.HttpServletResponse;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
public class XSLTFilter implements Filter {
private String xslPath = null;
public void init(FilterConfig config) throws ServletException {
//XSL/T 변환할 때 사용할 XSL 파일의 경로를 구합니다.
xslPath = config.getServletContext().getRealPath(
"/WEB-INF/xsl/book.xsl");
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//필터가 생성할 출력의 콘텐트 타입을 "text/html; charset = euc-kr"로 지정합니다. 따라서 웹 브라우저에 출력되는 문서는 HTML 문서가 됩니다
response.setContentType("text/html; charset=euc-kr");
PrintWriter writer = response.getWriter();
//필터 체인을 통해서 전달할 응답 래퍼 객체를 생성합니다.
XSLTResponseWrapper responseWrapper = new XSLTResponseWrapper(
(HttpServletResponse) response);
chain.doFilter(request, responseWrapper);
//체인을 실행한다. 체인을 통해서 응답 래퍼 객체가 전달되며, 따라서 JSP나 서블릿이 출력하는 내용은 응답 래퍼 객체의 버퍼(즉, XSLTResponseWrapper 클래스의 buffer필드)에 저장됩니다.
// XSL/T 변환
try {
TransformerFactory factory = TransformerFactory.newInstance();
Reader xslReader = new BufferedReader(new FileReader(xslPath));
StreamSource xslSource = new StreamSource(xslReader);
Transformer transformer = factory.newTransformer(xslSource);
String xmlDocument = responseWrapper.getBufferedString();
Reader xmlReader = new StringReader(xmlDocument);
//응답 래퍼로부터 JSP/서블릿이 생성한 내용을 XML문서 원본으로 사용합니다.
StreamSource xmlSource = new StreamSource(xmlReader);
StringWriter buffer = new StringWriter(4096);
//XSL/T 변환을 실행합니다.
transformer.transform(xmlSource, new StreamResult(buffer));
//변환 결과를 출력합니다.
writer.print(buffer.toString());
} catch (Exception ex) {
throw new ServletException(ex);
}
writer.flush();
writer.close();
}
public void destroy() {
}
}
④ web.xml 파일에 필터 설정을 추가
<?xml version="1.0" encoding="euc-kr"?>
<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_2_5.xsd"
version="2.5">
<filter>
<filter-name>XSLT</filter-name>
<filter-class>kame.chap21.filter.XSLTFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XSLT</filter-name>
<url-pattern>/xml/*</url-pattern>
</filter-mapping>
</web-app>
=> web.xml 파일에서 /xml/*로 들어오는 모든 요청에 대해서 XSLT 필터가 적용되도록 설정하였는데, 이 요청에 해당하는 JSP나 서블릿은 XSL 파일에 의해 알맞게 변환될 수 있는 XML 문서를 생성해 주면 됩니다.
출처 : 최범균의 JSP(2.1) 웹 프로그래밍 _ 가메출판사
[출처] Filter - 응용|작성자 원종천
'JAVA' 카테고리의 다른 글
[JAVA]filter ServletContext (0) | 2017.11.16 |
---|---|
[JAVA]Filter sendRedirect (0) | 2017.11.16 |
[JAVA]filter multpart (0) | 2017.11.16 |
[JAVA]Filter HttpServletResponseWrapper HTML 소스 컨트롤 (0) | 2017.11.16 |
[JAVA]Filter HTML 태그 제거 (0) | 2017.11.08 |