Spring MVC拦截器详解

package com.gary.util.spring;

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

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

/**
 * Spring MVC拦截器
 * @author gary
 *
 */
public class CommonInterceptor extends HandlerInterceptorAdapter implements InitializingBean{
	
	static Log log = LogFactory.getLog(CommonInterceptor.class);
	
	/**
	 * 在系统启动时执行
	 */
	public void afterPropertiesSet() throws Exception {
		log.debug("=======初始化CommonInterceptor拦截器=========");
	}
	
	/**
	 * 在Controller方法前进行拦截
	 * 如果返回false
	 * 		从当前拦截器往回执行所有拦截器的afterCompletion方法,再退出拦截器链.
	 * 如果返回true
	 * 		执行下一个拦截器,直到所有拦截器都执行完毕.
	 * 		再运行被拦截的Controller.
	 * 		然后进入拦截器链,从最后一个拦截器往回运行所有拦截器的postHandle方法.
	 * 		接着依旧是从最后一个拦截器往回执行所有拦截器的afterCompletion方法.
	 */
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		log.debug("=====preHandle====");
		//业务逻辑
		
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		log.debug("==========postHandle=========");
		
		if(modelAndView != null){
			String viewName = modelAndView.getViewName();
			log.debug("view name : " + viewName);
		}else{
			log.debug("view is null");
		}
	}
	
	/**
	 * 在Controller方法后进行拦截
	 * 当有拦截器抛出异常时,会从当前拦截器往回执行所有拦截器的afterCompletion方法
	 */
	@Override
	public void afterCompletion(HttpServletRequest httpservletrequest,
			HttpServletResponse httpservletresponse, Object obj,
			Exception exception) throws Exception {
		log.debug("=====afterCompletion====");
	}

	
}

部分配置

<property name="interceptors">
			<list>
				<bean class="com.gary.util.spring.CommonInterceptor"/>
				<bean class="com.gary.util.spring.CommonInterceptor2"/>
			</list>
		</property>

 实际运行结果(控制台DEBUG输出)

DispatcherServlet with name 'springmvc' processing GET request for [/demo/Demo/test.html]
Matching patterns for request [/Demo/test.html] are [/Demo/*]
URI Template variables for request [/Demo/test.html] are {}
Mapping [/Demo/test.html] to HandlerExecutionChain with handler [com.gary.test.controller.DemoController@1ed1dbe] and 1 interceptor
Returning handler method name 'test' for lookup path: /Demo/test.html
Last-Modified value for [/demo/Demo/test.html] is: -1
=====preHandle====
=====preHandle2====
Returning handler method name 'test' for lookup path: /Demo/test.html
进入到demo的test方法
==========postHandle2=========
view name : /Demo/test
==========postHandle=========
view name : /Demo/test
Invoking afterPropertiesSet() on bean with name '/Demo/test'
Rendering view [org.springframework.web.servlet.view.JstlView: name '/Demo/test'; URL [/Demo/test.jsp]] in DispatcherServlet with name 'springmvc'
Forwarding to resource [/Demo/test.jsp] in InternalResourceView '/Demo/test'
=====afterCompletion2====
=====afterCompletion====
Successfully completed request

猜你喜欢

转载自gary0416.iteye.com/blog/1086360