Spring拦截器

Spring Interceptors具备前处理和后处理web请求的能力,每一个拦截器类应当继承HandlerInterceptorAdapter类,你可以覆写任意preHandle(),postHandle()或afterCompletion()这三个回调方法。正如这个名字一样preHandler()方法会在处理请求之前被调用,postHandle()方法会在处理请求之后调用,而afterCompletion()将会在显示视图后被调用。

在每个方法里我们将使用log4j记录日志信息,首先应该实例化一个静态日志记录器,然后建立基本配置使得日志信息能显示在控制台。

LoggerInterceptor 类如下:

package com.zcl.spring.interceptor;

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

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class LoggerInterceptor extends HandlerInterceptorAdapter {
	static Logger logger = Logger.getLogger(LoggerInterceptor.class) ;
	static{
		BasicConfigurator.configure() ;
	}
	
	@Override
	public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception{
		logger.info("Before handling the request") ;
		return super.preHandle(request, response, handler) ;
	}
	
	@Override
	public void postHandle(HttpServletRequest request,HttpServletResponse response,Object handler,ModelAndView modelAndView) throws Exception{
		logger.info("After handling the request") ;
		super.postHandle(request, response, handler, modelAndView) ;
 	}
	
	@Override
	public void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) throws Exception{
		logger.info("After rendering the view") ;
		super.afterCompletion(request, response, handler, ex) ;
	}
}

现在你需要关联你已经创建的logger拦截器到映射处理,这里我们使用BeanNameUrlHandlerMapping,假如你需要的不止一个映射处理那么你需要将拦截器和它们每一个相关联。下面的配置即是如何关联拦截器到映射处理。

<?xml version="1.0" encoding="UTF-8"?>
<beans xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:p="http://www.springframework.org/schema/p" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://www.springframework.org/schema/beans"> 
	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix">
			<value>/WEB-INF/jsp/</value>
		</property>
		<property name="suffix">
			<value>.jsp</value>
		</property>
	</bean>
	<!--<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" 
		p:basename="message" />-->
	<bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" p:interceptors-ref="loggerInterceptor" />
	<bean id="loggerInterceptor" class="com.zcl.spring.interceptor.LoggerInterceptor" />
	<!--<context:component-scan base-package="com.zcl.spring.validation" />-->
	<bean id="userService" class="com.zcl.spring.validation.UserServiceImpl" />
	<!-- <bean id="userValidator" class="com.zcl.spring.validation.UserValidator" />-->
	<bean name="/userRegistration.html" class="com.zcl.spring.validation.UserController"
			p:userService-ref="userService" p:formView="userForm" 
			p:successView="userSuccess" />
</beans>

这里我们也要注意一下UserController如下:

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;


@SuppressWarnings("deprecation")
public class UserController extends SimpleFormController {
	private UserService userService ;
	public UserController(){
		setCommandClass(User.class) ;
		setCommandName("user") ;
	}
	public void setUserService(UserService userService){
		this.userService = userService ;
	}
	@Override
	protected ModelAndView onSubmit(Object command) throws Exception{
		User user = (User)command ;
		userService.add(user) ;
		return new ModelAndView("userSuccess","user",user) ;
	}
}

运行后我们会在控制台看到如下信息:

51242 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - DispatcherServlet with name 'dispatcher' determining Last-Modified value for [/spring3/userRegistration.html]
51243 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - Testing handler map [org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@116aeb] in DispatcherServlet with name 'dispatcher'
51248 [http-8888-2] DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping  - Mapping [/userRegistration.html] to handler 'com.zcl.spring.validation.UserController@1e13ce3'
51248 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - Testing handler adapter [org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@1be9101]
51251 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - Testing handler adapter [org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter@ce4dda]
51253 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - Last-Modified value for [/spring3/userRegistration.html] is: -1
51276 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - Bound request context to thread: org.apache.catalina.connector.RequestFacade@6ea9d2
51276 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - DispatcherServlet with name 'dispatcher' processing GET request for [/spring3/userRegistration.html]
51280 [http-8888-2] INFO com.zcl.spring.interceptor.LoggerInterceptor  - Before handling the request
51280 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - Testing handler adapter [org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@1be9101]
51280 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - Testing handler adapter [org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter@ce4dda]
51280 [http-8888-2] DEBUG com.zcl.spring.validation.UserController  - Displaying new form
51281 [http-8888-2] DEBUG com.zcl.spring.validation.UserController  - Creating new command of class [com.zcl.spring.validation.User]
51312 [http-8888-2] INFO com.zcl.spring.interceptor.LoggerInterceptor  - After handling the request
51318 [http-8888-2] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory  - Invoking afterPropertiesSet() on bean with name 'userForm'
51318 [http-8888-2] DEBUG org.springframework.web.servlet.view.InternalResourceViewResolver  - Cached view [userForm]
51318 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - Rendering view [org.springframework.web.servlet.view.JstlView: name 'userForm'; URL [/WEB-INF/jsp/userForm.jsp]] in DispatcherServlet with name 'dispatcher'
51318 [http-8888-2] DEBUG org.springframework.web.servlet.view.JstlView  - Rendering view with name 'userForm' with model {org.springframework.validation.BindingResult.user=org.springframework.validation.BeanPropertyBindingResult: 0 errors, user=com.zcl.spring.validation.User@c26acd} and static attributes {}
51319 [http-8888-2] DEBUG org.springframework.web.servlet.view.JstlView  - Added model object 'user' of type [com.zcl.spring.validation.User] to request in view with name 'userForm'
51319 [http-8888-2] DEBUG org.springframework.web.servlet.view.JstlView  - Added model object 'org.springframework.validation.BindingResult.user' of type [org.springframework.validation.BeanPropertyBindingResult] to request in view with name 'userForm'
51378 [http-8888-2] DEBUG org.springframework.web.servlet.view.JstlView  - Forwarding to resource [/WEB-INF/jsp/userForm.jsp] in InternalResourceView 'userForm'
53139 [http-8888-2] DEBUG org.springframework.beans.CachedIntrospectionResults  - Getting BeanInfo for class [com.zcl.spring.validation.User]
53144 [http-8888-2] DEBUG org.springframework.beans.CachedIntrospectionResults  - Caching PropertyDescriptors for class [com.zcl.spring.validation.User]
53144 [http-8888-2] DEBUG org.springframework.beans.CachedIntrospectionResults  - Found bean property 'aboutYou' of type [java.lang.String]
53144 [http-8888-2] DEBUG org.springframework.beans.CachedIntrospectionResults  - Found bean property 'class' of type [java.lang.Class]
53144 [http-8888-2] DEBUG org.springframework.beans.CachedIntrospectionResults  - Found bean property 'community' of type [[Ljava.lang.String;]
53144 [http-8888-2] DEBUG org.springframework.beans.CachedIntrospectionResults  - Found bean property 'country' of type [java.lang.String]
53144 [http-8888-2] DEBUG org.springframework.beans.CachedIntrospectionResults  - Found bean property 'gender' of type [java.lang.String]
53144 [http-8888-2] DEBUG org.springframework.beans.CachedIntrospectionResults  - Found bean property 'mailingList' of type [boolean]
53144 [http-8888-2] DEBUG org.springframework.beans.CachedIntrospectionResults  - Found bean property 'name' of type [java.lang.String]
53144 [http-8888-2] DEBUG org.springframework.beans.CachedIntrospectionResults  - Found bean property 'password' of type [java.lang.String]
53146 [http-8888-2] DEBUG org.springframework.beans.BeanUtils  - No property editor [java.lang.StringEditor] found for type java.lang.String according to 'Editor' suffix convention
53157 [http-8888-2] DEBUG org.springframework.beans.BeanUtils  - No property editor [booleanEditor] found for type boolean according to 'Editor' suffix convention
53157 [http-8888-2] INFO com.zcl.spring.interceptor.LoggerInterceptor  - After rendering the view
53158 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@6ea9d2
53158 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - Successfully completed request
53158 [http-8888-2] DEBUG org.springframework.web.context.support.XmlWebApplicationContext  - Publishing event in context [org.springframework.web.context.support.XmlWebApplicationContext@d7c6bf]: ServletRequestHandledEvent: url=[/spring3/userRegistration.html]; client=[0:0:0:0:0:0:0:1]; method=[GET]; servlet=[dispatcher]; session=[388885EBAC9B01B2FB0DC28FE9EBDCDD]; user=[null]; time=[1905ms]; status=[OK]
75058 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - Bound request context to thread: org.apache.catalina.connector.RequestFacade@6145c5
75058 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - DispatcherServlet with name 'dispatcher' processing POST request for [/spring3/userRegistration.html]
75059 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - Testing handler map [org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@116aeb] in DispatcherServlet with name 'dispatcher'
75059 [http-8888-2] DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping  - Mapping [/userRegistration.html] to handler 'com.zcl.spring.validation.UserController@1e13ce3'
75059 [http-8888-2] INFO com.zcl.spring.interceptor.LoggerInterceptor  - Before handling the request
75059 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - Testing handler adapter [org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@1be9101]
75059 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - Testing handler adapter [org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter@ce4dda]
75059 [http-8888-2] DEBUG com.zcl.spring.validation.UserController  - Creating new command of class [com.zcl.spring.validation.User]
75064 [http-8888-2] DEBUG org.springframework.beans.TypeConverterDelegate  - Converting String to [boolean] using property editor [org.springframework.beans.propertyeditors.CustomBooleanEditor@1d1f3f2]
75065 [http-8888-2] DEBUG com.zcl.spring.validation.UserController  - No errors -> processing submit
User add Success
75065 [http-8888-2] INFO com.zcl.spring.interceptor.LoggerInterceptor  - After handling the request
75065 [http-8888-2] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory  - Invoking afterPropertiesSet() on bean with name 'userSuccess'
75065 [http-8888-2] DEBUG org.springframework.web.servlet.view.InternalResourceViewResolver  - Cached view [userSuccess]
75065 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - Rendering view [org.springframework.web.servlet.view.JstlView: name 'userSuccess'; URL [/WEB-INF/jsp/userSuccess.jsp]] in DispatcherServlet with name 'dispatcher'
75065 [http-8888-2] DEBUG org.springframework.web.servlet.view.JstlView  - Rendering view with name 'userSuccess' with model {user=com.zcl.spring.validation.User@e6a73d} and static attributes {}
75065 [http-8888-2] DEBUG org.springframework.web.servlet.view.JstlView  - Added model object 'user' of type [com.zcl.spring.validation.User] to request in view with name 'userSuccess'
75065 [http-8888-2] DEBUG org.springframework.web.servlet.view.JstlView  - Forwarding to resource [/WEB-INF/jsp/userSuccess.jsp] in InternalResourceView 'userSuccess'
75369 [http-8888-2] INFO com.zcl.spring.interceptor.LoggerInterceptor  - After rendering the view
75369 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@6145c5
75369 [http-8888-2] DEBUG org.springframework.web.servlet.DispatcherServlet  - Successfully completed request
75370 [http-8888-2] DEBUG org.springframework.web.context.support.XmlWebApplicationContext  - Publishing event in context [org.springframework.web.context.support.XmlWebApplicationContext@d7c6bf]: ServletRequestHandledEvent: url=[/spring3/userRegistration.html]; client=[0:0:0:0:0:0:0:1]; method=[POST]; servlet=[dispatcher]; session=[388885EBAC9B01B2FB0DC28FE9EBDCDD]; user=[null]; time=[311ms]; status=[OK]

上即是记录的日志信息

如果我们要使用annotation,我们需要修改下UserController和配置文件。






评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值