springMVC 自定义拦截器

文章摘抄至 http://exceptioneye.iteye.com/blog/1303842

一、拦截器的配置

   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、基于注解的配置

<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-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/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

	<!-- 国际化 -->
	<bean id="messageSource"
		class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basename" value="message" />
	</bean>
	<bean id="localeResolver"
		class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />



	<!--Spring3.1开始的注解 HandlerMapping -->
	<bean
		class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />

	<!--Spring3.1开始的注解 HandlerAdapter -->
	<bean
		class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
		<!--线程安全的访问session -->
		<property name="synchronizeOnSession" value="true" />
	</bean>

	<!-- ViewResolver 视图解析类 -->
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass"
			value="org.springframework.web.servlet.view.JstlView" />
		<property name="prefix" value="/WEB-INF/jsp/" />
		<property name="suffix" value=".jsp" />
	</bean>

	<!-- 数据源 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName">
			<value>com.mysql.jdbc.Driver</value>
		</property>
		<property name="url">
			<!-- <value>jdbc:mysql://127.0.0.1:3306/myspring</value> -->
			<value>jdbc:mysql://172.16.14.81:3306/myspring</value>
		</property>
		<property name="username">
			<value>root</value>
		</property>
		<property name="password">
			<value>admin</value>
		</property>
	</bean>

	<!-- 指明操作数据库的配置文件位置 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="configLocation"
			value="classpath:../config/mybatis/MyBatis-Configuration.xml"></property>
	</bean>

	<!-- 使用事物处理 -->
	<bean id="tm"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>

	<tx:annotation-driven transaction-manager="tm" />

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


</beans>

二、拦截器类

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

	//在业务处理器处理请求执行完成后(执行完controller对应的方法之后),生成视图之前执行的动作 
	@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================");
	}

}

猜你喜欢

转载自hbiao68.iteye.com/blog/2020021