본문 바로가기

WEB_Programming/Struts

서블릿 필터 예제 (로그인에 이용해보기)

Example: Servlet filters
이 예제는 서블릿 필터를 이용하여 pre-login과 post-login 처리를 로그인 폼을 이용하여 처리하도록 하는 예제이다.

Servlet filter source code: LoginFilter.java

/**
* 서블릿 필터 예제 : 이 필터는 j_security_check와 사용자가 로그인을
* 수행하고자 할 경우 pre-login 액션을 수행할 수 있도록 하고, 로그인시
* 에러가 발생한 경우 브라우저 단으로 에러를 보내는 일을 수행한다.
*
* 이 필터는 init() 메소드에서 FilterConfig로부터 전달된 리스트 파일 이름을
* 호출하는 역할을 수행한다. 이것은 호출된 사용자 리스트 파일을 읽고
* 호출된 사용자 리스트를 생성하는 작업을 수행한다.
*
* doFilter 메소드는 호출된경우 사용자 로깅은 사용자 리스트에 이름이 존재하는지
* 검사를 수행한다.
*
*/

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class LoginFilter implements Filter {

    protected FilterConfig filterConfig;
   
    java.util.List revokeList;
   
   
    /**
    * init() : init() 메소드가 호출되면 필더가 생성된다.
    * 필터가 생된후 첫번째로 j_security_check는 애플리케이션에서 호출된다.
    */
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
       
        // read revoked user list
        revokeList = new java.util.ArrayList();
        readConfig();
    }
   
   
    /**
    * destroy() : destroy() 메소드는 필터가 서비스를 벗어나는 경우 호출된다.
    */
    public void destroy() {
        this.filterConfig = null;
        revokeList = null;
    }
   
    /**
    * doFilter() : doFilter() 메소드는 서블릿이 호출되기 전에 필터에 매핑된
    * 필터를 호출하도록 한다. 이 필더는 j_security_check와 매핑되어 있으며,
    * 메소드는 j_security_check 액션 이전에 호출되어 전달된다.
    */
    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws java.io.IOException, ServletException {
       
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse res = (HttpServletResponse)response;
       
        // pre login action
       
        // get username
        String username = req.getParameter("j_username");
       
        // if user is in revoked list send error
        if ( revokeList.contains(username) ) {
            res.sendError(javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED);
            return;
        }
       
        // call next filter in the chain : let j_security_check authenticate
        // user
        chain.doFilter(request, response);
       
        // post login action   
    }
   
    /**
    * readConfig() : 사용자 리스트 파일을 호출하여 읽고, 사용자 리스트를 생성한다.
    */
    private void readConfig() {
        if ( filterConfig != null ) {
       
            // get the revoked user list file and open it.
            BufferedReader in;
            try {
                String filename = filterConfig.getInitParameter("RevokedUsers");
                in = new BufferedReader( new FileReader(filename));
            } catch ( FileNotFoundException fnfe) {
                return;
            }
       
            // read all the revoked users and add to revokeList.
            String userName;
            try {
                while ( (userName = in.readLine()) != null )
                revokeList.add(userName);
            } catch (IOException ioe) {
            }
        }   
    }
}
중요 : 이전 샘플 코드에서, public void doFilter(ServletRequest request 의 시작 라인이다. 이것은 2개의 라인으로 분리되어 보이는 것이다. 결국에는 한 라인이다.

web.xml 파일의 부분에 LoginFilter 설정과 매핑된 j_security_check을 확인하라.

<filter id="Filter_1">
<filter-name>LoginFilter</filter-name>
<filter-class>LoginFilter</filter-class>
<description>Performs pre-login and post-login operation</description>
<init-param>
<param-name>RevokedUsers</param-name>
<param-value>c:\WebSphere\AppServer\installedApps\
<app-name>\revokedUsers.lst</param-value>
</init-param>
</filter-id>

<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/j_security_check</url-pattern>
</filter-mapping>
An example of a revoked user list file:

user1
cn=user1,o=ibm,c=us
user99
cn=user99,o=ibm,c=us