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后,执行该方法。主要用于回收资源。

执行成功!

 

posted @ 2019-12-04 12:30  All_just_for_fun  阅读(164)  评论(0编辑  收藏  举报