[JAVA]Filter responseWrapper

JAVA 2017. 11. 16. 13:32

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
블로그 이미지

마크제이콥스

초보 개발자의 이슈및 공부 내용 정리 블로그 입니다.

,