フィルタFilterとインターセプタ

18589 ワード

フィルタFilterとインターセプタ
今日はフィルタFilterとブロッカーInterceptorについて学びました.まずこの2つを理解します.
フィルターFilter:たくさんのものがあるときは、あなたの要求に合ったものを選んでほしいだけです.これらの要件を定義するツールは、フィルタです.(理解:アルファベットの山からBを取ることです)
ブロッカーInterceptor:プロセスが進行中の場合、その進行に介入したり、進行を終了したりすることを望んでいます.これはブロッカーがしたことです.(理解:アルファベットの山の中で、彼に介入して、検証を通じて少なくして、ついでに他のものをします).
この2つを簡単に実現します(ログイン操作):
フィルタFilter:1.フィルタFilterのパッケージとクラスを作成します(Filterインタフェースを継承します):
package com.zhongruan.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class LoginFilter implements Filter {
     
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
     
        //     
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
     
        //servletRequest    ,  HttpServletRequest   ,       HttpServletRequest   ,   getSession
        //HttpServletRequest      servletRequest  ,    Http     

        //       request response
        HttpServletRequest request=(HttpServletRequest)servletRequest;
        HttpServletResponse response= (HttpServletResponse) servletResponse;

        //  session,indexOf(),                
        HttpSession session = request.getSession();
        if (session.getAttribute("userInfo")==null && request.getRequestURI().indexOf("/user/doLogin.do")==-1){
     
            //    ,    
            response.sendRedirect(request.getContextPath()+"/user/doLogin.do");
        }else {
     
            //    ,       (    )
            filterChain.doFilter(request,response);
        }
    }

    @Override
    public void destroy() {
     
        //     
    }
}

2.フィルタは要求がコンテナ(Tomcat)に入った後であるが、要求がサーブレットに入る前であるため、その構成はweb.xmlで行われる.
 <!--    filter       -->
  <filter>
    <filter-name>SessionFilter</filter-name>
    <filter-class>com.zhongruan.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>SessionFilter</filter-name>
    <!--<url-pattern>/user/*-->
    /pages/*
    *.jsp
    /css/*
    /img/*
  

これは簡単なフィルタ実装であり,ユーザがログインせずに他のページに直接アクセスしようとするとフィルタがフィルタリングされ,ログインページに戻る
インターセプタInterceptor:1.フィルタと同様に、インターセプタInterceptorのパッケージとクラスを作成します(HandlerInterceptorインタフェースを継承します):
package com.zhongruan.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginInterceptor implements HandlerInterceptor{
     

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
     
        //        ,     true           (    )
        //1.     User     ,         
        HttpSession session = request.getSession();
        //String url = request.getRequestURI();
        //System.out.println("    action :"+url);
        // url.indexOf("user/doLogin.do")!=-1

        if (session.getAttribute("userInfo")!=null){
     
            return true;
        }else {
     
            //    ,      
            response.sendRedirect(request.getContextPath()+"/user/doLogin.do");
            return false;
        }

    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
     
        //      ,    
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
     
        //    ,     
    }
}

2.インターセプタ(interceptor)はactionリクエストにのみ機能するため、spring-mvcで構成するには:
<!--    4.     -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--         mvc      -->
            <mvc:mapping path="/**"/>
            <!--/             -->
            <mvc:exclude-mapping path="/user/doLogin.do"/>
            <!--              -->
            <bean class="com.zhongruan.interceptor.LoginInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

これは,ユーザがログインせずに直接action要求を行ってページに入るとブロックし,ログインページに戻る簡単なブロックの実装である.
フィルタFilterとブロッキングInterceptorの簡単な実装は、それらがどのように運用されているかを理解するだけでなく、ブロッキングとフィルタの違いを区別することを学ばなければなりません.1.ブロッキングはactionリクエストにのみ機能し、フィルタはほとんどのリクエストに機能します.2.フィルタは、要求がコンテナに入った後であるが、要求がサーブレットに入る前である.要求終了復帰時も、サーブレット処理完了後、フロントエンドに復帰する前
AOP:ブロッキングとフィルタは実はAOPプログラミング思想の実現であり、権限検査、ログ記録を体現することができる.ただし相違点:1.適用範囲が異なる:filterはサーブレット規定規範でwenプログラムにのみ使用できる.ブロッカーはwebでも使えますし、Application、Swingプログラムでも使えます.2.仕様が異なる:filterはサーブレット規定仕様であり、サーブレット容器がサポートする.ブロッカーはSpringコンテナ内にあり、Springフレームでサポートされています.3.使用するリソースが異なる:4.深さが異なる.
まとめ:フィルタFilterとブロッカーInterceptorを学び、不要なインタフェースリクエストをブロックしたり、リクエスト(request)とレスポンス(response)の内容を変更したり、CORSのドメイン間リクエストを完了したりすることができます.利用すれば、Webページをより安全に保護することができます.