作用
拦截器可处理Web应用中请求的一些通用性问题
共性问题在拦截器中处理,可以减少重复代码,便于维护
使用场景
处理所有请求的共同问题
1. 解决乱码问题
用户发送请求到达Controller之前进行拦截,对request中的参数设置编码
2. 解决权限验证问题
用户进行一些请求时,查看Session中是否有登陆信息,没有则跳转到登陆界面
过滤器
与过滤器的区别
- 拦截器只能拦截url
拦截器Interceptor依赖于框架容器,基于反射机制,只过滤请求 - 过滤器还可拦截资源文件
过滤器Filter依赖于Servelt容器,基于回调函数,过滤范围大,资源文件、url等
过滤器处理乱码问题
<!-- web.xml中设置 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharaterEncodingFilter</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>
拦截器的实现
实现步骤
- 编写拦截器类实现HandleInterceptor接口
- 将拦截器注册进Spring MVC框架中
- 配置拦截器的拦截规则
例子
编写类
public class TestInterceptor implements HandleInterceptor{ //进入Controller之前调用 //Object参数:被拦截的请求目标对象 public boolean preHandle(HttpServletRequest req,HttpServletResponse resp,Object obj) throws Exception{ //可提前对request,response进行处理 req.setCharaterEncoding("utf-8"); //解决乱码问题 if (req.getSession().getAttribute("user")==null) { //用户没有登录,拦截并跳转登录界面 req.getRequestDispatcher("/login").forward(req,resp); return false; } return true; //true通过,不拦截;false不通过,拦截 } //进行Controller之后的操作 public void postHandle(HttpServletRequest req,HttpServeltResponse resp,Object obj,ModelAndView model) throws Exception { model.addObject("msg","拦截器发送属性给JSP"); model.setViewName("/other"); //跳转到其他页面 } //最后调用的方法,destory等操作 public void afterCompletion(HttpServletRequest req,HttpServletResponse resp,Object obj,Exception excp) throws Exception{ } }
注册
springmvc配置文件注册;配置文件中要有mvc的命名空间与编写规则的xsd文件<mvc:interceptors> <bean class="实现类的路径.类名"/> </mvc:interceptor>
拦截规则
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="url正则表达式"/> <!--拦截匹配的url--> <bean class=""></bean> </mvc:interceptor> </mvc:interceptor>