8.学习springmvc的拦截器
一.springmvc拦截器介绍和环境搭建
1.介绍:
过滤器:servlet中的一部分,可以拦截所有想要访问的资源。
拦截器:SpringMVC框架中的,只能在SpringMVC中使用并且只能过滤控制器的方法。
流程:用户访问页面->执行拦截器1->执行拦截器2->执行控制器方法->跳转页面->展示给用户
2.入门代码:
编写自定义的拦截器类MyInterceptor1:
1 /** 2 * 自定义拦截器类 3 * @author USTC_WZH 4 * @create 2019-12-04 12:26 5 */ 6 public class MyInterceptor1 implements HandlerInterceptor { 7 8 9 /** 10 * 预处理方法,controller方法被执行前先执行 11 * return true 放行,执行下一个拦截器,若没有拦截器则执行Controller中的方法 12 * return false 不放行,可以通过request或response进行页面跳转 13 * @param request 14 * @param response 15 * @param handler 16 * @return 17 * @throws Exception 18 */ 19 @Override 20 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 21 22 System.out.println("MyInterceptor1执行了..."); 23 return true; 24 } 25 }
配置springmvc.xml中拦截器属性:
1 <!--配置拦截器--> 2 <mvc:interceptors> 3 <!--配置拦截器--> 4 <mvc:interceptor> 5 <!--设置具体要拦截的方法:path="/**"为拦截所有方法,path="/user/*"为拦截user下的方法--> 6 <mvc:mapping path="/user/*"></mvc:mapping> 7 <!--配置不要拦截的方法与<mvc:mapping path=""></mvc:mapping> 二者一般只设置一个--> 8 <!--<mvc:exclude-mapping path=""></mvc:exclude-mapping>--> 9 <!--配置拦截器对象为自己写的拦截器类--> 10 <bean class="edu.ustc.interceptor.MyInterceptor1"></bean> 11 </mvc:interceptor> 12 </mvc:interceptors>
编写控制器方法:
1 /** 2 * @author USTC_WZH 3 * @create 2019-12-04 12:13 4 */ 5 @Controller 6 @RequestMapping("/user") 7 public class UserController { 8 9 @RequestMapping("/testInterceptor") 10 public String testInterceptor(){ 11 System.out.println("testInterceptor执行了..."); 12 13 return "success"; 14 } 15 }
编写jsp:
index.jsp:
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>Title</title> 5 </head> 6 <body> 7 8 <h3>SpringMVC拦截器</h3> 9 <a href="user/testInterceptor">SpringMVC拦截器</a> 10 11 </body> 12 </html>
success.jsp:
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>success</title> 5 </head> 6 <body> 7 8 <h3>测试Interceptor成功</h3> 9 10 <% System.out.println("success.jsp执行了..."); %> 11 12 </body> 13 </html>
执行结果:
3.拦截器接口演示
preHandle:预处理方法,在控制器方法执行之前执行,return true后执行控制器方法,return false并指定跳转页面则不执行控制器方法。可以用与检测用户是否登陆,未登录跳转登陆页面。
1 /** 2 * 预处理方法,controller方法被执行前先执行 3 * return true 放行,执行下一个拦截器,若没有拦截器则执行Controller中的方法 4 * return false 不放行,可以通过request或response进行页面跳转 5 * @param request 6 * @param response 7 * @param handler 8 * @return 9 * @throws Exception 10 */ 11 @Override 12 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 13 14 System.out.println("MyInterceptor1d的preHandle方法执行了..."); 15 // return true; 16 request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response); 17 return false; 18 19 }
error.jsp:
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>error</title> 5 </head> 6 <body> 7 <h3>这是错误页面</h3> 8 </body> 9 </html>
postHandle:后处理方法,在Controller之后执行并在Controller需要跳转的页面之前执行
1 /** 2 * 后处理方法,在Controller之后执行,在Controller需要跳转的success.jsp之前执行。 3 * 注:当指定跳转页面后会执行后处理方法跳转的页面 4 * @param request 5 * @param response 6 * @param handler 7 * @param modelAndView 8 * @throws Exception 9 */ 10 @Override 11 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 12 System.out.println("MyInterceptor1d的postHandle方法执行了..."); 13 request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response); 14 15 }
afterCompletion方法在Controller方法执行之后执行并在产生的页面success.jsp后,执行该方法。主要用于回收资源。
执行成功!