`

SpringMVC拦截器简单使用

 
阅读更多

基于上一篇文章的基础上

 

一、拦截器的配置

   1、传统的配置

 

<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>

 

  2、基于注解的配置

 

<!-- 拦截器 -->
	<mvc:interceptors>
	    <!-- 多个拦截器,顺序执行 -->
	    <mvc:interceptor>
	       <mvc:mapping path="/entryOrJsonController/*" /><!-- 如果不配置或/*,将拦截所有的Controller -->
	       <bean class="com.wy.interceptor.CommonInterceptor"></bean>
	    </mvc:interceptor>
	</mvc:interceptors>

 

 

 

 

二、拦截器类

 

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("==============执行顺序: 1、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("==============执行顺序: 2、postHandle================");
	}

	/**
	 * 在DispatcherServlet完全处理完请求后被调用 
	 * 
	 *   当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
	 */
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
		log.info("==============执行顺序: 3、afterCompletion================");
	}

}

 

 

注意:注释中的说明。

 

完整的spring配置文件

 

<?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>

 

 

分享到:
评论
10 楼 2047699523 2015-03-16  
spring mvc demo教程源代码下载:http://www.zuidaima.com/share/kspringmvc-p1-s1.htm
9 楼 107x 2015-02-28  
不错,谢谢! 
8 楼 zebing007 2014-07-29  
7 楼 guojigjkill 2014-07-09  
[color=brown][/color]
    
6 楼 123456789012 2014-03-17  
http://cobaya.org.cn/
5 楼 123456789012 2014-03-17  
不错,很棒!<a href="http://cobaya.org.cn/">留站不留名,扯淡走天涯!</a>
4 楼 zzulb123 2014-02-21  
引用
3 楼 宋建勇 2013-09-09  
2 楼 meiyx 2012-10-11  
<!--一个拦截器多个mapping path的配置-->
		<mvc:interceptor>
			<mvc:mapping path="/ads/plan/channel" />
			<mvc:mapping path="/ads/plan/keyword" />
			<mvc:mapping path="/ads/plan/wordAdd" />
			<mvc:mapping path="/ads/plan/save" />
			<ref bean="planAgreementInterceptor" />
		</mvc:interceptor>

1 楼 meiyx 2012-10-10  

<!——设置spring拦截器若mvc:mapping的path相同则按照配置先后形成拦截器链 ——> 
<mvc:interceptors> <mvc:interceptor> 
<mvc:mapping path="/*" /> 
<bean class="test.interceptor.TestInterceptor1" />
</mvc:interceptor> <mvc:interceptor> 
<mvc:mapping path="/*" /> 
<bean class="test.interceptor.TestInterceptor2" />
</mvc:interceptor>
 </mvc:interceptors> 

相关推荐

Global site tag (gtag.js) - Google Analytics