目录
2、过滤器类实现 HandlerInterceptor 接口
过滤器-拦截器(preHandle方法)-被调用程序运行结束-拦截器(postHandle方法)-拦截器(afterCompletion方法)
8、延伸阅读-使用拦截器或者过滤器修改 request 的参数值
1、Spring基础环境搭建(略)
2、过滤器类实现 HandlerInterceptor 接口
不要对里面的 maxSize 参数感到奇怪,他是可有可无的,其来自于xml配置中配置的参数,看下一步
preHandle return false 时程序就会中止
如果想要页面跳转到一个单独到页面可以
response.sendRedirect(request.getContextPath() + "/路径"); return false;
package com.bestcxx.stu.fileup.intercepter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor {
private long maxSize;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println(this.getClass()+" preHandle开始:"+System.currentTimeMillis());
System.out.println(this.getClass()+" 自定义拦截器访问前:"+maxSize);
if(request!=null && ServletFileUpload.isMultipartContent(request)) {
ServletRequestContext ctx = new ServletRequestContext(request);
long requestSize = ctx.contentLength();
if (requestSize > maxSize) {
throw new MaxUploadSizeExceededException(maxSize);
}
}
System.out.println(this.getClass()+" preHandle结束:"+System.currentTimeMillis());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
System.out.println(this.getClass()+" postHandle开始:"+System.currentTimeMillis());
System.out.println(this.getClass()+" 自定义拦截器访问中:"+maxSize);
System.out.println(this.getClass()+" postHandle结束:"+System.currentTimeMillis());
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
System.out.println(this.getClass()+" afterCompletion开始:"+System.currentTimeMillis());
System.out.println(this.getClass()+" 自定义拦截器访问后:"+maxSize);
System.out.println(this.getClass()+" afterCompletion结束:"+System.currentTimeMillis());
}
public void setMaxSize(long maxSize) {
this.maxSize = maxSize;
}
}
3、mvc:interceptors 配置
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:orm="http://www.springframework.org/schema/orm"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd
http://www.springframework.org/schema/orm http://www.springframework.org/schema/orm/spring-orm-4.3.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
">
<!-- 拦截器配置 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.bestcxx.stu.fileup.intercepter.MyInterceptor">
<property name="maxSize" value="5000"></property>
</bean>
</mvc:interceptor>
</mvc:interceptors>
</beans>
4、拦截器访问顺序
访问-过滤器-拦截器(访问前,中,后三个方法都会被调用)
5、看看我们的测试方法-线程暂停1000毫秒
@GetMapping(value="restfulGetResponseBody")
@ResponseBody
public AjaxRespnseModel<String> restfulGetResponseBody(){
System.out.println(this.getClass()+" restfulGetResponseBody开始:"+System.currentTimeMillis());
AjaxRespnseModel<String> a=new AjaxRespnseModel<String>();
a.setResult("RESTful风格测试");
a.setMsg("RESTful风格测试,仅仅用户测试get方法。");
//线程停止1000毫秒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(this.getClass()+" restfulGetResponseBody结束:"+System.currentTimeMillis());
return a;
}
6、实验打印结果
不要在意第一行,那个是我写的一个filter,不过可以认为,Filter是限于interceptor执行的
class com.bestcxx.stu.fileup.filter.MyFilter 自定义路过的filter
class com.bestcxx.stu.fileup.intercepter.MyInterceptor preHandle开始:1505445860408
class com.bestcxx.stu.fileup.intercepter.MyInterceptor 自定义拦截器访问前:5000
class com.bestcxx.stu.fileup.intercepter.MyInterceptor preHandle结束:1505445860408
class com.bestcxx.stu.fileup.controller.RestfulController restfulGetResponseBody开始:1505445860411
class com.bestcxx.stu.fileup.controller.RestfulController restfulGetResponseBody结束:1505445861411
class com.bestcxx.stu.fileup.intercepter.MyInterceptor postHandle开始:1505445861475
class com.bestcxx.stu.fileup.intercepter.MyInterceptor 自定义拦截器访问中:5000
class com.bestcxx.stu.fileup.intercepter.MyInterceptor postHandle结束:1505445861475
class com.bestcxx.stu.fileup.intercepter.MyInterceptor afterCompletion开始:1505445861475
class com.bestcxx.stu.fileup.intercepter.MyInterceptor 自定义拦截器访问后:5000
class com.bestcxx.stu.fileup.intercepter.MyInterceptor afterCompletion结束:1505445861475
7、执行顺序
过滤器-拦截器(preHandle方法)-被调用程序运行结束-拦截器(postHandle方法)-拦截器(afterCompletion方法)
8、延伸阅读-使用拦截器或者过滤器修改 request 的参数值
在实际访问中,有时候我们会遇到参数需要处理的情况,比如数字隐藏,加密解密等,这个时候需要对传递中的参数进行二次处理
使用拦截器(org.springframework.web.servlet.HandlerInterceptor)和过滤器(javax.servlet.Filter)都可以实现这个功能
过滤器 中
@Override
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.getParameterMap().put("参数名",新值);
chain.doFilter(request,response);
}
拦截器中
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
request.getParameterMap().put("参数名",新值);
return true;
}
由于本文是拦截器的,所以附上过滤器的配置-web.xml 中增加
<filter>
<filter-name>myFilter</filter-name>
<filter-class>**.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/a/b/*</url-pattern>
</filter-mapping>
9、获取所有的入参
Set<String> set=request.getParameterMap().keySet();
Iterator iterator=set.iterator();
while(iterator.hasNext()){
logger.info(iterator.next());
}