一、
1、跟过滤器比较像的技术
2、发送请求时被拦截器拦截,在控制器的前后添加额外的功能
2.1、跟AOP区分开,AOP在特定方法前后扩充(对ServiceImpl)
2.1、拦截器,请求的拦截,针对点是控制器方法(对Controller)
3、SpringMVC 拦截器和Filter的区别
3.1 拦截器只能拦截Controller
3.2 Filter 可以拦截任何请求
4、实现自定义拦截器的步骤:
4.1 新建类实现 HandlerInterceptor
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("preHandle111"); return true; } //控制器执行完成,在进入jsp页面之前执行 //日志记录 //敏感词汇过滤 @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { System.out.println("postHandle222"); System.out.println("往"+arg3.getViewName()+"跳转"); String word = arg3.getModel().get("model").toString(); String newWord=word.replace("傻逼","好孩子"); arg3.getModel().put("model",newWord); } //jsp执行完成后执行 //记录执行过程中异常(日志收集) //不管出不出现异常都执行这个方法 @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) 如果没有异常 arg3为 Null throws Exception { System.out.println(arg3.getMessage()); System.out.println("afterCompletion3333"); } }
4.2 在springmvc.xml 中配置拦截器,需要拦截哪些控制器
4.2.1 指定 Controller 进行拦截
<!-- 拦截器配置 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/demo"/> / 项目根目录
<mvc:mapping path="/demo2"/>
<bean class="com.bjsxt.interceptor.DemoInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
4.2.2 对全部的 Controller 进行拦截
<!-- 拦截器配置 -->
<mvc:interceptors>
<bean class="com.bjsxt.interceptor.DemoInterceptor"></bean>
</mvc:interceptors>
二、拦截器栈
1、多个拦截器同时生效时,则成了拦截器栈
2、顺序:先进后出
3、执行顺序和在springmvc.xml 中配置顺序有关 栈(先进后出)
<!-- 拦截器配置 --> <mvc:interceptors> <bean class="com.bjsxt.interceptor.DemoInterceptor"></bean> <bean class="com.bjsxt.interceptor.DemoInterceptor2"></bean> </mvc:interceptors>
4、设置先配置拦截器A 再配置拦截器B 执行顺序为
preHandle(A) --> preHandle(B) --> 控制器方法 ----> postHandle(B) ---> postHandle(A)
----> JSP ----> afterCompletion(B) ---> afterCompletion(A)
实例:必须通过登录页面才能进入mian.jsp和main2.jsp
1、jsp页面
1.1 Login.jsp页面
2、新建控制器类
@Controller public class DemoController { @RequestMapping("{page}") public String page(@PathVariable String page){ System.out.println("restful"); return page; } @RequestMapping("login") public String login(Users user,HttpSession session){ if(user.getUsername().equals("admin")&&user.getPassword().equals("123")){ session.setAttribute("user", user); return "main"; }else{ return "redirect:/login.jsp"; } } }
3、在springmvc.xml 中配置 拦截器
<!-- 自定义拦截器 -->
<mvc:interceptors>
<bean class="com.bjsxt.interceptor.LoginInterceptor"></bean>
</mvc:interceptors>
4、新建拦截器类
public class LoginInterceptor implements HandlerInterceptor{ @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { } @Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { String uri = arg0.getRequestURI(); if(uri.equals("/springmvc8/login")){ return true; }else{ Object user = arg0.getSession().getAttribute("user"); if(user!=null){ return true; }else{ arg1.sendRedirect("/springmvc8/login.jsp"); return false; } } } }
使用SpringMVC拦截器实现登录验证
1、把页面放入到web-inf中
1.1 放入到wen-inf 中后必须通过控制器转发到页面
1.2 springmvc拦截器拦截的是控制器,不能拦截jsp
2、通过拦截器拦截全部控制器,需要在拦截器内容放行 login控制器