自定义拦截器
- 跟过滤器比较像的技术。发送请求时,被拦截器拦截,在控制器的前后添加额外功能。
- 注意:
①跟aop区分:aop拦截特定方法(service实现类);
②拦截器是用来拦截请求,针对于控制器方法(对controller);
- SpringMVC拦截器和Filter的区别:
拦截器只能拦截controller;
Filter可以拦截任何请求;
- 拦截区别
WebServlet("/")除了.jsp以外的请求都进行拦截;
WebServlet("/*")所有请求都拦截
- Fileter用法:
/*创建Filter类*/
public class DemoFilter implements Filter{
}
<!--在web.xml中配置Filter类-->
<filter>
<filter-name></filter-name>
<filter-class></filter-class>
</filter>
<filter-mapping>
<filter-name></filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>
- springmvc拦截器(interceptor)配置
第一步
/*创建Interceptor类*/
public class DemoInterceptor inplements HandlerInterceptor{
}
HandlerInterceptor的方法 | 作用 |
---|---|
preHandle | 在进入控制器之前执行,如果返回值为false,阻止进入拦截器。控制代码写到这里,比如什么时候可以访问控制器。 |
postHandle | 在控制器执行完成,进入到jsp之前进行。如:日志记录、敏感词过滤。 |
afterCompletion | 在jsp执行完成后执行。记录在执行过程中出现的异常。可以吧异常记录在日志中。 |
preHandle 参数 | 作用 |
---|---|
HttpServletRequest | 请求参数 |
HttpServletResponse | 响应参数 |
Object | 所拦截的是哪个控制器的哪个方法 |
postHandle 参数 | 作用 |
---|---|
HttpServletRequest | 请求参数 |
HttpServletResponse | 响应参数 |
Object | 所拦截的是哪个控制器的哪个方法 |
ModelAndView | 具备传值和视图功能,可以获取传的参数和进行页面跳转。在控制器中传入参数Model,model.addAttribute()进行传值,return进行跳转。此时可以通过ModelAndView进行获取和修改。 |
afterCompletion 参数 | 作用 |
---|---|
HttpServletRequest | 请求参数 |
HttpServletResponse | 响应参数 |
Object | 所拦截的是哪个控制器的哪个方法 |
Exception | 执行过程的异常 |
第二步
在springmvc.xml里配置拦截器
<!--配置拦截器,第一种方法-->
<mvc:interceptors>
<!--配置拦截器类,表示所有控制器器都拦截-->
<bean class=”xxx.xxx.interceptor,DemoInterceptor”></bean>
</mvc:interceptors>
<!--配置拦截器,第二种方法-->
<mvc:interceptors>
<!--配置拦截器类,表示拦截特定url的控制器-->
<mvc:interceptor>
<mvc:mapping path="/demo"/>
<mvc:mapping path="/demo1"/>
<mvc:mapping path="/demo2"/>
<!--表示只拦截demo、demo1、demo2控制器,@RequestMapping("demo")-->
<bean class=”xxx.xxx.interceptor.DemoInterceptor”></bean>
</ mvc:interceptor>
</mvc:interceptors>
- 测试方法
可以在filter、控制器、jsp中写输出语句,看看执行顺序。执行的中心点在控制器。