SpringMVC攔截器簡單使用

1、攔截器的配置html

   一、傳統的配置java

xml代碼web

<bean  
        class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" >  
        <property name="interceptors">  
           <!-- 多個攔截器,順序執行 -->  
           <list>  
              <ref bean="commonInterceptor"/>  
           </list>  
        </property>  
    </bean>  
    <!--   
              若是不定義mappingURL,則默認攔截全部對Controller的請求 ;   
             可使用正則表達式對url進行匹配,從而更細粒度的進行攔截(.*/entryOrJsonController\.do\?action=reg.*);  
    -->  
    <bean id="commonInterceptor" class="com.wy.interceptor.CommonInterceptor">  
       <property name="mappingURL" value=".*/entryOrJsonController\.do\?action=reg.*"/>  
    </bean>  

  二、基於註解的配置正則表達式

xml代碼spring

<!-- 攔截器 -->  
    <mvc:interceptors>  
        <!-- 多個攔截器,順序執行 -->  
        <mvc:interceptor>  
           <mvc:mapping path="/entryOrJsonController/*" /><!-- 若是不配置或/*,將攔截全部的Controller -->  
           <bean class="com.wy.interceptor.CommonInterceptor"></bean>  
        </mvc:interceptor>  
    </mvc:interceptors>  

2、攔截器類apache

java代碼json

package com.wy.interceptor;

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

import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class CommonInterceptor implements HandlerInterceptor {

    private Logger log = Logger.getLogger(CommonInterceptor.class);
    
    public CommonInterceptor() {
        // TODO Auto-generated constructor stub
    }

    private String mappingURL;//利用正則映射到須要攔截的路徑  
        public void setMappingURL(String mappingURL) {  
               this.mappingURL = mappingURL;  
       } 

    /**
     * 在業務處理器處理請求以前被調用
     * 若是返回false
     *     從當前的攔截器往回執行全部攔截器的afterCompletion(),再退出攔截器鏈
     * 
     * 若是返回true
     *    執行下一個攔截器,直到全部的攔截器都執行完畢
     *    再執行被攔截的Controller
     *    而後進入攔截器鏈,
     *    從最後一個攔截器往回執行全部的postHandle()
     *    接着再從最後一個攔截器往回執行全部的afterCompletion()
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        // TODO Auto-generated method stub
        log.info("==============執行順序: 一、preHandle================");
        String url=request.getRequestURL().toString();  
        if(mappingURL==null || url.matches(mappingURL)){  
            request.getRequestDispatcher("/msg.jsp").forward(request, response);
            return false; 
        }  
        return true;
    }

    //在業務處理器處理請求執行完成後,生成視圖以前執行的動做 
    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub
        log.info("==============執行順序: 二、postHandle================");
    }

    /**
     * 在DispatcherServlet徹底處理完請求後被調用 
     * 
     *   當有攔截器拋出異常時,會從當前攔截器往回執行全部的攔截器的afterCompletion()
     */
    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub
        log.info("==============執行順序: 三、afterCompletion================");
    }

}

注意:註釋中的說明。spring-mvc

 

完整的spring配置文件mvc

java代碼app

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:util="http://www.springframework.org/schema/util" 
        xsi:schemaLocation="
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-3.0.xsd
          http://www.springframework.org/schema/mvc    
          http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
          http://www.springframework.org/schema/util 
          http://www.springframework.org/schema/util/spring-util-3.0.xsd">
    
    <!-- 默認的註解映射的支持 ,它會自動註冊DefaultAnnotationHandlerMapping 與AnnotationMethodHandlerAdapter 
    <mvc:annotation-driven />
    -->
    
    <!-- 配置靜態資源,直接映射到對應的文件夾,不被DispatcherServlet處理,3.04新增功能,須要從新設置spring-mvc-3.0.xsd -->
    <mvc:resources mapping="/js/**" location="/js/" />
    
    <!-- 自動掃描註解的Controller -->
    <context:component-scan base-package="com.wy.controller.annotation" />
    
    <!-- 處理在類級別上的@RequestMapping註解-->
    <bean
        class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" >
        <property name="interceptors">
           <!-- 多個攔截器,順序執行 -->
           <list>
              <ref bean="commonInterceptor"/>
           </list>
        </property>
    </bean>
    <!-- 
             若是不定義mappingURL,則默認攔截全部對Controller的請求 ; 
             可使用正則表達式對url進行匹配,從而更細粒度的進行攔截(.*/entryOrJsonController\.do\?action=reg.*);
    -->
    <bean id="commonInterceptor" class="com.wy.interceptor.CommonInterceptor">
       <property name="mappingURL" value=".*/entryOrJsonController\.do\?action=reg.*"/>
    </bean>
        
    <!-- 處理方法級別上的@RequestMapping註解-->
    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
        <property name="messageConverters">  
             <util:list id="beanList">  
                <ref bean="mappingJacksonHttpMessageConverter"/>  
            </util:list>  
        </property> 
    </bean>
    
    <!-- 
              將指定路徑的請求直接轉到對應的view上,而不須要特定的controller來處理請求 .
              注意:此處的映射路徑是/hello,請求時http://localhost:8080/SpringMVC/hello
              不能在hello.xxx,而不使用此種方式的映射能夠加的,由於web.xml配置的是‘/-->
    <mvc:view-controller path="/hello" view-name="hello" />
     
    <!-- 視圖解析器策略 和 視圖解析器 -->
    <!-- 對JSTL提供良好的支持 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 默認的viewClass,能夠不用配置
        <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView" />
         -->
        <property name="prefix" value="/WEB-INF/page/" />
        <property name="suffix" value=".jsp" />
    </bean>
    
    <!-- 處理JSON數據轉換的 -->
    <bean id="mappingJacksonHttpMessageConverter" 
        class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
        <!-- 爲了處理返回的JSON數據的編碼,默認是ISO-88859-1的,這裏把它設置爲UTF-8,解決有亂碼的狀況 --> 
        <property name="supportedMediaTypes">  
               <list>  
                    <value>text/html;charset=UTF-8</value>  
                </list>  
        </property>  
    </bean>  
    
    <!-- 攔截器 -->
    <mvc:interceptors>
        <!-- 多個攔截器,順序執行 -->
        <mvc:interceptor>
           <mvc:mapping path="/entryOrJsonController/*" /><!-- 若是不配置或/*,將攔截全部的Controller -->
           <bean class="com.wy.interceptor.CommonInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
    
    <!-- 
       ResourceBundleViewResolver經過basename所指定的ResourceBundle解析視圖名。
                  對每一個待解析的視圖,ResourceBundle裏的[視圖名].class所對應的值就是實現該視圖的類。
                  一樣,[視圖名].url所對應的值是該視圖所對應的URL。
                  能夠指定一個parent view,其它的視圖均可以從parent view擴展。
                  用這種方法,能夠聲明一個默認的視圖。
     
    <bean id="messageSource"
        class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="welcome" />
    </bean>
    -->
    
</beans>
相關文章
相關標籤/搜索