SpringMvc Interceptorブロッカーの構成と使用

10231 ワード

作者:tonytfjing+Java兔
DispatcherServlet
SpringMVCには、すべてのリクエストがDispatcherServiceletを通過する統合されたエントリDispatcherServiceletがあります.DispatcherServiceletはフロントコントローラであり、webに配置する.xmlファイルの.一致する要求をブロックして、サーブレットは一致する規則をブロックして自分で定義して、ブロックした要求を、ある規則によって目標のControllerに配布して処理します.だから私たちは今web.xmlには、次の構成が追加されています.
<servlet>
    <servlet-name>demoservlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    <init-param>
        <param-name>contextConfigLocationparam-name>
        <param-value>classpath:spring-mvc.xmlparam-value>
    init-param>
    <load-on-startup>2load-on-startup>
    <async-supported>trueasync-supported>
servlet>
<servlet-mapping>
    <servlet-name>demoservlet-name>
    
    <url-pattern>*.dourl-pattern>
servlet-mapping>

静的リソースはブロックされません
一般的にブロックを実装するのは、主に権限管理のためであり、主にurlリクエストをブロックするため、静的リソースをブロックしません.静的リソースをフィルタリングするにはspring-mvc.xmlプロファイルでは、次のように構成されています.

<mvc:resources mapping="/resources/**" location="/resources/" cache-period="300" />

カスタムブロッキング
SpringMVCのインターセプタHandlerInterceptorAdapterは、3つのpreHandle,postHandle,afterCompletionメソッドを提供します.
  • preHandleは、トラフィックプロセッサが要求を処理する前に呼び出される.
  • postHandleは、トラフィックプロセッサ処理要求の実行が完了した後、ビューを生成する前に実行される.
  • afterCompletionは、DispatcherServiceletが要求を完全に処理した後に呼び出され、リソースのクリーンアップなどに使用できます.

  • そのため、独自の権限管理ロジックを実現するには、HandlerInterceptorAdapterを継承し、その3つの方法を書き直す必要があります.
  • springmvc.xmlに自己定義のブロッカーを追加する:
  •   
    <mvc:interceptors>
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
        <mvc:interceptor>
                
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/resources/**"/>
            <bean class="com.wx.app.ygp.action.interceptor.LoginInterceptor">bean>
        mvc:interceptor>
          
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/resources/**"/>
            
            <bean class="**com.wx.app.ygp.action.interceptor.MessageInterceptor**">bean> 
        mvc:interceptor>
    mvc:interceptors>
  • カスタムブロッキングの具体的なコード:
  • package com.wx.app.ygp.action.interceptor;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.log4j.Logger;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    
    /**
     * 
     * @author huangjp
     * @Descripition :        
     * 2017 6 22    1:11:11
     */
    public class MessageInterceptor extends HandlerInterceptorAdapter{
    
        /**
         *      URL
         */
        private static final String[] INTERCEPTOR_URL = {
                "/icCard/workCard.do?menuId=97",
                "/billManagement/counterPayment/show.do?menuId=2003",
                "/icCard/dailyBusiness.do?menuId=95",
                "/icCard/exceptionBusiness.do?menuId=96"
        };
    
        private static final String MESSAGE_URL = "/message/show.do";
    
        private final Logger logger = Logger.getLogger(MessageInterceptor.class);
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            //      url:http://localhost:8080/ygp/icCard/workCard.do
            String url = request.getRequestURL().toString(); 
            String message = request.getParameter("message");
    
            //            ,           
            for(String oneUrl : INTERCEPTOR_URL){
                if(url.contains(oneUrl.split("[?]")[0]) && message == null){
                    logger.info("         ");
                    fowardMessage(request, response, oneUrl);
                    return false;
                }
            }
    
            logger.info("          ");
            return true;
        }
    
        /**
         *          
         * @param : menuUrl
         * @throws IOException 
         * @throws ServletException 
         */
        private void fowardMessage(HttpServletRequest request,HttpServletResponse response, String menuUrl) throws ServletException, IOException{
    
            RequestDispatcher rd = request.getRequestDispatcher(MESSAGE_URL+"?menuUrl="+menuUrl);
            rd.forward(request, response);
    
        }
    }
    

    これにより、簡単なカスタムブロッキングが完了します.
    参考資料
    http://blog.csdn.net/tonytfjing/article/details/39207551
    http://blog.csdn.net/liumm0000/article/details/7565480
    http://hc24.iteye.com/blog/2063660