SpringMVC 拦截器
一 自定义拦截器
1. 跟过滤器比较像的技术
2.发送请求时被拦截器拦截,在控制器前后添加额外功能
2.1 跟AOP 区分开,AOP 在特定方法前后扩充(对ServiceImpl)
2.2 拦截器,请求拦截,针对点是控制器方法(对Controller)
3. SpringMVC 拦截器 和 Filter的区别
3.1 拦截器只能拦截Controller
3.2 Filter可以拦截任何请求
4. 实现自定义拦截器的步骤
4.1 新建类实现 HandlerInterceptor 接口
package com.chen.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 DemoInterceptor implements HandlerInterceptor{
//在进入控制器之前执行
//如果返回值为false,阻止进入控制器
//控制代码
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("arg2:"+arg2);
System.out.println("preHandle");
return true;
}
//控制器执行完成,进入jsp之前执行.
//日志记录
//敏感词语过滤
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("往"+arg3.getViewName()+"跳转");
System.out.println("model的值"+arg3.getModel().get("model"));
String word = arg3.getModel().get("model").toString();
String newWord = word.replace("祖国", "**");
arg3.getModel().put("model",newWord);
System.out.println("postHandle");
}
//jsp执行完成后执行
//记录执行过程中出现的异常
//可以把异常几率到日志中
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("agr3:"+arg3);
System.out.println("afterCompletion"+arg3.getMessage());
}
}
4.2 在 SpringMVC.xml配置拦截器需要拦截哪些控制器
4.2.1 拦截所有控制器
<!-- 拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<bean class="com.chen.controller.DemoController"></bean>
</mvc:interceptor>
</mvc:interceptors>
4.2.2 拦截特定的 url
<!-- 拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/demo"/>
<mvc:mapping path="/demo1"/>
<mvc:mapping path="/demo2"/>
<bean class="com.chen.controller.DemoController"></bean>
</mvc:interceptor>
</mvc:interceptors>
二 拦截器栈
1. 多个拦截器同时生效时,组成拦截器栈
2.顺序 先进后厨
3 执行顺序和在springmvc.xml 中配置顺序有关
preHandle(A) -> preHandle(B) -> 控制器方法 -> postHandle(B) ->postHanle(A) -> jsp -> afterCompletion(B)-> afterCompletion(A)
三 使用springmvc 拦截器实现登陆验证
1 把页面放到 web-inf中
2 放入到web-inf中后必须通过控制器转发到页面,springMVC 拦截器拦截的是控制器,不拦截jsp
2. 通过拦截器栈拦截全部控制器,需要在拦截器内部方形login控制器
controller
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object arg2) throws Exception {
String uri = req.getRequestURI();
if(uri.equals("/springmvc03/login")){
return true;
}else{
Object obj = req.getSession().getAttribute("users");
if(obj!=null){
eturn true;
}
res.sendRedirect("/springmvc03/login.jsp");
return false;
}
}
<!-- 配置拦截器 -->
<mvc:interceptors>
<bean class="com.chen.interceptor.LoginInterceptor"></bean>
</mvc:interceptors>