Java 차단기와 필터의 차이 분석

1. 필터 (filter)


필터는 클라이언트와 웹 리소스(Servlet, JSP, HTML) 사이에 있으며, 클라이언트와 웹 리소스 간의 요청과 응답은 필터를 통해 필터링됩니다.예: 필터에 192.10.10.1 액세스 금지 주소가 정의되어 있습니다. 그러면 클라이언트가 192.10.10.1 액세스 요청을 할 때 필터를 통해 클라이언트가 받은 응답은 이 IP 액세스 금지 알림입니다.자바 웹에서, 당신이 전송한request,response는 정보를 미리 필터링하거나, 파라미터를 미리 설정한 다음, servlet이나struts의action에 전송하여 업무 논리를 진행합니다. 예를 들어 불법 URL(login.do의 주소 요청이 아니라, 사용자가 착륙하지 않으면 필터링)을 필터링하거나, servlet이나struts의action에 전송하기 전에 문자 집합을 통일적으로 설정하거나, 불법 문자 집합을 제거합니다.

2. 차단기(interceptor)


차단기는 일종의 방면/절면 프로그래밍(AOP Aspect-Oriented Programming)이고 절단면은 여러 모듈의 유니버설 서비스를 분리하는 것이다. 예를 들어 권한 관리, 로그 서비스이다. 그들은 여러 모듈에서 모두 사용할 수 있고 각자 재사용 가능한 모듈로 봉인할 수 있다.이러한 유니버설 서비스의 구체적인 실현은 차단기를 통해 이루어진다. 예를 들어 사용자 클라이언트가 일부 보안 모듈에 접근하려면 먼저 권한 심사의 차단기를 통해 권한 심사를 하고 사용자가 이 조작의 권한을 가지고 있는지 확인해야 아래로 실행할 수 있다.절단면 프로그래밍을 위한 것은 당신의 서비스나 방법 앞에서 방법을 호출하거나 방법 후에 방법을 호출하는 것입니다. 예를 들어 동적 에이전트는 차단기의 간단한 실현입니다. 방법을 호출하기 전에 문자열을 출력하거나 다른 업무 논리적인 조작을 할 수도 있습니다. 또한 방법을 호출한 후에 문자열을 출력할 수도 있고 심지어 이상이 발생했을 때 업무 논리적인 조작을 할 수도 있습니다.

3. 차단기와 필터의 차이


1. 차단기는 자바의 반사 메커니즘을 바탕으로 하고 필터는 함수 리셋을 바탕으로 한다(직책 체인)
2. 필터는 servlet 용기에 의존하고 차단기는 servlet 용기에 의존하지 않는다
3. 차단기는 액션 요청에만 작용할 수 있고 필터는 거의 모든 요청에 작용할 수 있다
4. 차단기는 액션 상하문, 값 창고의 대상에 접근할 수 있지만 필터는
5. action의 생명주기에서 차단기는 여러 번 호출될 수 있으며, 필터는 용기 초기화 시 한 번만 호출될 수 있다
실행 순서: 필터 전-차단 전-액션 처리-차단 후-필터 후.개인적으로 필터는 수평적인 과정이라고 생각한다. 먼저 클라이언트가 제출한 내용을 필터한다. (예를 들어 로그인하지 않은 사용자가 내부 페이지에 접근할 수 없는 처리)필터가 통과되면 차단기는 사용자가 제출한 데이터의 검증을 검사하고 전기적인 데이터 처리를 한 다음에 처리된 데이터를 대응하는 Action에 보낸다.Action 처리가 완료되면 차단기는 다른 과정을 할 수 있습니다. (뭘 할지 생각지도 못했습니다.) 필터의 후속 작업으로 위로 돌아갈 수 있습니다.
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±

4. 상세 설명


차단기: 절단면을 대상으로 프로그래밍하는 것은 당신의 서비스나 방법 앞에서 방법을 호출하거나 방법 후에 방법을 호출하는 것입니다. 예를 들어 동적 에이전트는 차단기의 간단한 실현입니다. 방법을 호출하기 전에 문자열을 출력하거나 다른 업무 논리를 조작할 수도 있습니다. 또한 방법을 호출한 후에 문자열을 출력할 수도 있습니다. 심지어 이상이 발생했을 때 업무 논리를 조작할 수도 있습니다.
다음은 필터와 차단기의 차이를 실례를 통해 살펴보겠습니다.
차단기를 사용하여/admin 디렉터리에서 jsp 페이지를 필터합니다

<package name="newsDemo" extends="struts-default" namespace="/admin">
        <interceptors>
            <interceptor name="auth" class="com.test.news.util.AccessInterceptor" />
            <interceptor-stack name="authStack">
                <interceptor-ref name="auth" />
            </interceptor-stack>
        </interceptors>
        <!-- action -->
        <action name="newsAdminView!*" class="newsAction" method="{1}">
            <interceptor-ref name="defaultStack"/>
            <interceptor-ref name="authStack">
            </interceptor-ref>
            
다음은 제가 이룬 Interceptor class:

package com.test.news.util;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.test.news.action.AdminLoginAction;
/**
* @author chaoyin
*/
public class AccessInterceptor extends AbstractInterceptor {
    private static final long serialVersionUID = -4291195782860785705L;
    
    @Override
    public String intercept(ActionInvocation actionInvocation) throws Exception {
         
         ActionContext actionContext = actionInvocation.getInvocationContext();
         Map session = actionContext.getSession();
      
        //except login action
         Object action = actionInvocation.getAction();
        if (action instanceof AdminLoginAction) {
            return actionInvocation.invoke();
         }
        //check session
        if(session.get("user")==null ){
            return "logout";
         }
        return actionInvocation.invoke();//go on
     }
}
필터:java 웹에서 당신이 전송한request,response는 정보를 미리 필터하거나 파라미터를 미리 설정한 다음에 servlet이나struts의 action을 전송하여 업무 논리를 합니다. 예를 들어 불법 URL(login.do의 주소 요청이 아니라 사용자가 로그인하지 않으면 필터링)을 필터하거나 servlet이나struts의 action을 전송하기 전에 문자 집합을 통일적으로 설정하거나 불법 문자를 제거합니다.
필터를 사용하여/admin 디렉터리 아래 jsp 페이지의 필터를 진행합니다. 우선 웹에 있습니다.xml 필터 설정:

<filter>
        <filter-name>access filter</filter-name>
        <filter-class>
             com.test.news.util.AccessFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>access filter</filter-name>
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>
다음은 필터링 구현 클래스입니다.

package com.test.news.util;
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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class AccessFilter implements Filter {
/**
* @author chaoyin
*/
  
    public void destroy() {
    
     }
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
             FilterChain filterChain) throws IOException, ServletException {
             
         HttpServletRequest request = (HttpServletRequest)arg0;
         
         HttpServletResponse response = (HttpServletResponse)arg1;
         
         HttpSession session = request.getSession();
         
        if(session.getAttribute("user")== null && request.getRequestURI().indexOf("login.jsp") ==-1 ){
             response.sendRedirect("login.jsp");
            return ;
         }
         
         filterChain.doFilter(arg0, arg1);
     }
    public void init(FilterConfig arg0) throws ServletException {
    
     }
}
자바 차단기와 필터의 차이 분석에 관한 이 글을 소개합니다. 자바 차단기와 필터에 관한 더 많은 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보시기 바랍니다. 앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기