<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--请求参数-->
<init-param>
<param-name>encoding</param-name>
<param-value>utf8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
拦截器的实现
1、编写拦截器实现HandlerInterceptor接口2、将拦截器注册SpringMVC框架中
3、配置拦截器的拦截规则
编写一个拦截器的类。
package com.cc.cyang.model.adpater;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class Test implements HandlerInterceptor{
//用来做一些资源的销毁此方法不经常用。
//比如流的销毁,线程的销毁。
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("执行到了afterCompletion方法");
}
//可以通过ModelAndView参数来改变显示的视图,或修改发往视图的方法
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
System.out.println("执行到了postHandle方法");
}
//返回值:表示我们是否需要将当前请求拦截下来
//如果返回false,请求将被终止,请求不会到达控制器。也不会执行postHandle也不会执行afterCompletion
//如果返回true,请求会被继续执行
//Object arg2表示的是被拦截的请求的目标的对象
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2) throws Exception {
System.out.println("执行到了preHandle方法");
return false;
}
}
当然编写好一个拦截器之后还要在注册到springMVC中。
在springMVC.xml中注册拦截器
首先在xml中添加mvc的命名空间,然后在后面添加mvc的.xsd文件格式描述符文件
<mvc:interceptors>
<bean class="com.cc.cyang.model.adpater.Test"></bean>
</mvc:interceptors>
首先是执行
System.out.println("执行到了preHandle方法");
再次执行是到达目标后执行里面方法之后执行的方法
System.out.println("执行到了postHandle方法");
最后在执行完所有的方法之后执行
System.out.println("执行到了afterCompletion方法");
当然拦截器里面可以控制拦截的路径。
之请求提交路径是view.from的进行拦截
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path = “view.form”/>
<bean class="com.cc.cyang.model.adpater.Test"></bean>
</mvc:interceptor>
</mvc:interceptors>
拦截器方法的介绍
1、preHandle方法,在请求处理之前进行拦截
2、postHandle方法,在请求被处理之后进行调用
3、aftterCompletion方法,在请求结束之后才进行调用
在一个应用当中多个拦截器。
拦截器的其它实现方式
package com.cc.cyang.model.adpater;
import org.springframework.ui.ModelMap;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.context.request.WebRequestInterceptor;
public class Test implements WebRequestInterceptor {
public void afterCompletion(WebRequest arg0, Exception arg1)
throws Exception {
}
public void postHandle(WebRequest arg0, ModelMap arg1) throws Exception {
}
public void preHandle(WebRequest arg0) throws Exception {
}
}
拦截器的类还可以通过实现WebRequestInterceptor接口来编写。
想springMVC框架注册的写法不变。
弊端:preHandle方法没有返回值,不能终止请求。
拦截器的使用场景
使用原则:处理所有请求的共同问题。
1、解决乱码问题
2、解决权限问题
拦截器与过滤器的区别
过滤器Filter依赖于servlet容器,基于回调函数,这个还可以过滤资源一类的,过滤范围大。
拦截器Interceptor依赖于框架容器,基于反射机制,只过滤请求。
总结
拦截器可以处理WEB应用中请求的一些通用性问题。
共性问题在拦截器中处理,可以减少重复代码,便于维护。