SSMフレームワークのブロッカーとフィルタの設定について

16687 ワード

ブロッキングとフィルタは、プロジェクトでフィルタ要求をブロックする機能を果たしていることがわかりますので、設定時にバカになる可能性があります.ここではまずそれらの違いを比較します.
  • フィルタFilterはJavaEE規格であり、サーブレットの仕様で定義されているサーブレットコンテナがサポートし、サーブレットコンテナに属し、サーブレットコンテナに依存する.インターセプタInterceptorはSpringのコンポーネントの1つであり、Springフレームワークに属するものであり、Springフレームワークに依存してSpring管理に帰し、Springのファイルに配置されるため、Spring内のいかなるリソースやオブジェクト、例えばServiceオブジェクト、データソース、トランザクション管理などを使用することができるので、SpringのIOC注入方式で注入すればよいが、Filterはできない.(コンフィギュレーションファイルで構成すると、Filterはweb.xmlに、InterceptorはSpring MVCのコンフィギュレーションファイルに配置されます.複数のフィルタの実行順序はweb.xmlファイルで定義された前後関係に関係します.複数のブロッカーの間の実行順序はSpringMVCのコンフィギュレーションファイルで定義された前後順序に関係します.)
  • フィルタFilterは関数コールバックに基づいて実現される.インターセプタはjavaによる反射機構で実現され,接面プログラミング(AOP)向けの運用に属する.
  • ブロッカー(Springフレームワークに依存するため)はControllerリクエストのみをブロックし、静的リソースへの直接アクセスなどの他のリクエストはブロック処理できませんが、フィルタはほとんどのリクエストに機能します.
  • ブロッカー(Springコンポーネントの1つ)はactionコンテキスト、値スタック内のオブジェクトにアクセスできますが、フィルタはアクセスできません.
  • actionのライフサイクルでは、ブロッキングは複数回呼び出され、フィルタはコンテナの初期化で1回しか呼び出されません.インターセプターはIOCコンテナのそれぞれのbeanを取得することができ、フィルタがだめであることが重要であり、インターセプターにサービスを注入し、ビジネスロジックを呼び出すことができます.上を通じて、インターセプターとフィルタの違いを知っています.次に、それらがどのように設置されているかを見てみましょう.

  • フィルタ
    フィルタの設定は、Filterインタフェースを実装し、init(初期化フィルタ)、doFilter(フィルタ要求)、destroy(フィルタ破棄)を書き換えることによって行われる.
    public class LoginFilter implements Filter {
     
     	@Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
                throws IOException, ServletException {
            // TODO Auto-generated method stub
            HttpServletRequest request = (HttpServletRequest)arg0;
            HttpServletResponse response = (HttpServletResponse)arg1;
            HttpSession session = request.getSession();
            
            if(session.getAttribute("_CURRENT_USER")==null && request.getRequestURI().indexOf("/home.action") == -1
                        && request.getRequestURI().indexOf("/login.action") == -1 // -1      url
                    ){
                //     
                response.sendRedirect(request.getContextPath()+"/home.action");
            }else{
                //     ,         (    )
                arg2.doFilter(arg0, arg1);
            }
        }
     
     	@Override
        public void init(FilterConfig arg0) throws ServletException {
            // TODO Auto-generated method stub
        }
         
        @Override 
        public void destroy() {
            // TODO Auto-generated method stub
        }
    }
    

    フィルタにはwebが必要ですxmlはこのクラスを構成します.
    <filter>
           <filter-name>LoginFilterfilter-name>
           <filter-class>cn.itcast.util.LoginFilterfilter-class>//  class            
    filter>
    <filter-mapping>
           <filter-name>LoginFilterfilter-name>
           
           <url-pattern>/*url-pattern>
    filter-mapping>
    

    ブロッキング
    インターセプタの設定には、HandlerInterceptorインタフェースを実装し、preHandle(controller呼び出し前)、postHandle(Controller呼び出し後、DispatcherServiceletがレンダリングビューに戻る前に呼び出される)、afterCompletion(ビューレンダリングが完了した後に呼び出される)を書き換える必要があります.
    @Component
    public class MyItercepter implements HandlerInterceptor {
    
    	 /**
          *     Controller     
          * @param request
          * @param response
          * @param obj
          * @return true       (            ) false       ,              ,      response    。
          * @throws Exception
          */
         @Override
         public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
    	    //          ,    true           (    )
    		//   false      
    		HttpSession session = request.getSession();
    		//String uri = request.getRequestURI(); //      uri,         
    		//if(session.getAttribute("LOGIN_USER")!=null || uri.indexOf("system/login")!=-1) {//                 			
    		if(session.getAttribute("LOGIN_USER")!=null) {
    			//        
    			return true;
    		}else {
    			//          
    			response.sendRedirect(request.getContextPath()+"/system/login");
    			return false;
    		}
         }
         /**
          *  Controller    , DispatcherServlet           ,    ModelAndView           。
          *   : ModelAndView      null
          * @param request
          * @param response
          * @param obj
          * @param modelAndView
          * @throws Exception
          */
         @Override
         public void postHandle(HttpServletRequest request, HttpServletResponse response, Object obj, ModelAndView modelAndView) throws Exception {
             //       ,    	
         }
     
         /**
          *           
          * @param request
          * @param response
          * @param obj
          * @param e
          * @throws Exception
          */
         @Override
         public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object obj, Exception e) throws Exception {
             //     ,     
         }
     }
    

    ブロッキングを構成する場合もspring-mvc.xmlでこのクラスを構成する
    
    <mvc:interceptors>
    	<mvc:interceptor>
    		
    		<mvc:mapping path="/**"/>
    		
    		<mvc:exclude-mapping path="/system/login" />
    		<bean class="com.lingshi.bookstore.interceptor.MyItercepter">bean>			
    	mvc:interceptor>
    mvc:interceptors>