自定义拦截器
springmvc可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定功能
自定义拦截器必须实现HandlerInterceptor接口
-preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request
进行处理。如果你决定该拦截器对请求进行拦截处理后还要调用其他拦截器,或者业务处理器
去进行处理,则返回true;如果你决定不需要再调用其他组件处理请求,则返回false
-postHandle():这个方法在业务处理器处理完请求后,但是DispatchServlet向客户端返回
响应前被调用,在该方法中对用户请求request进行处理
-afterCompletion():这个方法在DispatchServlet完全处理完请求后被调用,可以在该方法中
进行一些资源清理操作
多个拦截器执行顺序
package com.hous.crud.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class FirstInterceptor implements HandlerInterceptor {
/*
* 该方法在目标方法之前被调用
* 若返回值为true,则继续调用后续的拦截器和目标方法
* 若返回值为false,则不会再调用后续的拦截器和目标方法
*
* 可以考虑做权限,日志,事务等
*/
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("[FirstInterceptor]preHandle");
return true;
}
/*
* 调用目标方法之后,渲染视图之前
* 可以对请求域中的属性或视图做出修改
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView mv)
throws Exception {
// System.out.println(mv.getViewName());
System.out.println(request.getRequestURI());
System.out.println("[FirstInterceptor]postHandle");
}
/*
* 渲染视图之后被调用,释放资源
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("[FirstInterceptor]afterCompletion");
}
}
<?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:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd 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-4.2.xsd"> <!-- 自动扫描bean --> <context:component-scan base-package="com.hous.crud"></context:component-scan> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property> </bean> <!-- 解决静态资源路径问题 --> <mvc:default-servlet-handler/> <mvc:annotation-driven conversion-service="conversionService"/> <!-- 将自定义的转换器注册到springmvc上下文中 org.springframework.context.support.ConversionServiceFactoryBean org.springframework.format.support.FormattingConversionServiceFactoryBean --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <ref bean="employeeConverter"/> </set> </property> </bean> <!-- 配置国际化 --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="i18n"></property> </bean> <!-- 配置SessionLocaleResolver --> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean> <mvc:interceptors> <!-- 配置自定义拦截器 --> <bean class="com.hous.crud.interceptor.FirstInterceptor" /> <!-- 配置LocaleChangeInterceptor --> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> <mvc:interceptor> <mvc:mapping path="/json"/> <bean class="com.hous.crud.interceptor.SecondInterceptor" /> </mvc:interceptor> </mvc:interceptors> <!-- <mvc:view-controller path="/i18n"/> --> <mvc:view-controller path="/i18n2"/> <!-- 文件上传解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="UTF-8"></property> <property name="maxUploadSize" value="1024000"></property> </bean> </beans>
package com.hous.crud.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class SecondInterceptor implements HandlerInterceptor {
/*
* 该方法在目标方法之前被调用
* 若返回值为true,则继续调用后续的拦截器和目标方法
* 若返回值为false,则不会再调用后续的拦截器和目标方法
*
* 可以考虑做权限,日志,事务等
*/
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("[SecondInterceptor]preHandle");
return true;
}
/*
* 调用目标方法之后,渲染视图之前
* 可以对请求域中的属性或视图做出修改
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView mv)
throws Exception {
// System.out.println(mv.getViewName());
System.out.println(request.getRequestURI());
System.out.println("[SecondInterceptor]postHandle");
}
/*
* 渲染视图之后被调用,释放资源
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("[SecondInterceptor]afterCompletion");
}
}