当前位置:   article > 正文

SpringMVC——核心技术:拦截器(一个/多个、权限拦截器)_在springcloud项目中其中一个微服务中可以写多个拦截器吗

在springcloud项目中其中一个微服务中可以写多个拦截器吗

文章目录:

1.介绍

2.一个拦截器的实例 

2.1 控制器类 

2.2 拦截器类

2.3 springmvc配置文件

2.4 web.xml

2.5 index.jsp

2.6 other.jsp

2.7 执行结果

2.7.1 访问index.jsp的页面

2.7.2 在index.jsp页面提交用户请求、转到other.jsp的页面 

2.7.3 IDEA中得到拦截器类的输出结果 

3.多个拦截器的实例

3.1 控制器类

3.2 两个拦截器类

3.3 springmvc配置文件

3.4web.xml文件与上面的例子相同

3.5 index.jsp

3.6 result.jsp

3.7 运行结果 

4.权限拦截器(简单的应用小实例)

4.1 控制器类

4.2 拦截器类

4.3 springmvc配置文件、web.xml文件与第一个例子是一样的

4.4 首页index.jsp

4.5 result.jsp(用于显示index.jsp页面的提交结果)

4.6 登录、登出页面(login.jsp、logout.jsp)

4.7 非用户无法登录页面(tips.jsp)

4.8 运行结果 

5.写在结尾


1.介绍

SpringMVC 中的 Interceptor 拦截器是非常重要和相当有用的,它的主要作用是拦截指定的用户请求,并进行相应的预处理与后处理。其拦截的时间点在“处理器映射器根据用户提交的请求映射出了所要执行的处理器类,并且也找到了要执行该处理器类的处理器适配器,在处理器适配器执行处理器之前”。当然,在处理器映射器映射出所要执行的处理器类时,已经将拦截器与处理器组合为了一个处理器执行链,并返回给了中央调度器。

拦截器其实就是springmvc框架中的一种对象,需要实现 HandlerInterceptor 接口,拦截用户的请求、controller的请求。

拦截用户的请求可以预先对请求做处理,根据处理结果,决定是否执行 controller;也可以把多个 controller 中公用的功能定义到拦截器

拦截器的定义:1)创建一个类实现 HandlerInterceptor 接口,实现接口中的三个方法。

                         2)在springmvc配置文件中,声明拦截对象,并指定拦截的 uri 地址。


2.一个拦截器的实例 

2.1 控制器类 

  1. package com.songzihao.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.servlet.ModelAndView;
  5. import javax.servlet.http.HttpSession;
  6. /**
  7. *
  8. */
  9. @Controller
  10. public class MyController {
  11. @RequestMapping(value = "/some.do")
  12. public ModelAndView doSome(HttpSession session,String name, Integer age) {
  13. System.out.println("执行了MyController的doSome()方法");
  14. //添加一个临时数据
  15. session.setAttribute("attr","控制器中新增加的临时数据");
  16. ModelAndView mv=new ModelAndView();
  17. mv.addObject("myName",name);
  18. mv.addObject("myAge",age);
  19. mv.setViewName("result");
  20. return mv;
  21. }
  22. }

2.2 拦截器类

注释写的很详细了!!! 

  1. package com.songzihao.handler;
  2. import org.springframework.web.servlet.HandlerInterceptor;
  3. import org.springframework.web.servlet.ModelAndView;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import javax.servlet.http.HttpSession;
  7. import java.util.Date;
  8. /**
  9. *
  10. */
  11. public class MyInterceptor implements HandlerInterceptor {
  12. /**
  13. * preHandle: 预先处理请求的方法
  14. * 参数: Object handler: 被拦截的控制器对象(MyController)
  15. * 返回值boolean: true 表示请求正确,控制器方法会被执行
  16. * false 表示请求不正确,控制器方法不会被执行
  17. * 特点: 1.预处理方法的执行时间在控制器方法之前
  18. * 2.可以对请求做处理,可以做登录的检查、权限的判断、统计数据等
  19. * 3.决定请求是否执行
  20. */
  21. @Override
  22. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  23. System.out.println("===MyInterceptor拦截器的preHandle===");
  24. //request.getRequestDispatcher("/tips.jsp").forward(request,response);
  25. return true;
  26. }
  27. /**
  28. * postHandle: 后处理方法
  29. * 参数: Object handler: 被拦截的控制器对象(MyController)
  30. * ModelAndView: 控制器方法的返回值(请求的执行结果)
  31. * 特点: 1.在控制器方法之后执行的
  32. * 2.能获取控制器方法的执行结果,可以修改原来的执行结果(数据、视图)
  33. * 3.可以看作对请求的二次处理
  34. */
  35. @Override
  36. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv) throws Exception {
  37. System.out.println("===MyInterceptor拦截器的postHandle===");
  38. //对请求做二次处理
  39. if(mv!=null) {
  40. mv.addObject("myDate",new Date());
  41. mv.setViewName("other");
  42. }
  43. }
  44. /**
  45. * afterCompletion: 最后执行的方法
  46. * 参数: Object handler: 被拦截的控制器对象(MyController)
  47. * Exception: 异常对象
  48. * 特点: 1.在请求处理完成后执行的(请求处理完成的标志是视图处理完成、对视图执行完forward操作后)
  49. * 2.可以做程序最后要做的工作(释放内存、清理临时变量)
  50. * 3.方法的执行条件: 1) 当前拦截器的 preHandle() 方法必须执行
  51. * 2) 当前拦截器的 preHandle() 方法必须返回true
  52. */
  53. @Override
  54. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  55. System.out.println("===MyInterceptor拦截器的afterCompletion===");
  56. //获取临时数据
  57. HttpSession session=request.getSession();
  58. Object attr=session.getAttribute("attr");
  59. System.out.println("attr===" + attr);
  60. //删除临时数据
  61. session.removeAttribute("attr");
  62. //判断数据是否已被删除
  63. attr=session.getAttribute("attr");
  64. System.out.println("attr===" + attr);
  65. }
  66. }

2.3 springmvc配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
  7. <!-- springmvc的配置文件 -->
  8. <context:component-scan base-package="com.songzihao.controller" />
  9. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  10. <property name="prefix" value="/WEB-INF/view/" />
  11. <property name="suffix" value=".jsp" />
  12. </bean>
  13. <mvc:annotation-driven />
  14. <!-- 声明拦截器 -->
  15. <mvc:interceptors>
  16. <!-- 声明第一个拦截器 -->
  17. <mvc:interceptor>
  18. <!--
  19. 指定拦截器的拦截地址
  20. path: 拦截器的uri地址,使用 ** 通配符
  21. -->
  22. <mvc:mapping path="/**"/>
  23. <!-- 指定使用的拦截器 -->
  24. <bean class="com.songzihao.handler.MyInterceptor" />
  25. </mvc:interceptor>
  26. </mvc:interceptors>
  27. </beans>

2.4 web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6. <!-- 声明springmvc的核心对象 -->
  7. <servlet>
  8. <servlet-name>DispatcherServlet</servlet-name>
  9. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  10. <!-- 自定义配置文件的位置 -->
  11. <init-param>
  12. <param-name>contextConfigLocation</param-name>
  13. <param-value>classpath:springmvc.xml</param-value>
  14. </init-param>
  15. <!-- tomcat服务器创建对象的顺序,数值(大于等于0)越小,创建对象的时间就越早 -->
  16. <load-on-startup>1</load-on-startup>
  17. </servlet>
  18. <servlet-mapping>
  19. <servlet-name>DispatcherServlet</servlet-name>
  20. <!-- 意思是将 *.do 的请求交给 DispatcherServlet 处理 -->
  21. <url-pattern>*.do</url-pattern>
  22. </servlet-mapping>
  23. <filter>
  24. <filter-name>CharacterEncodingFilter</filter-name>
  25. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  26. <init-param>
  27. <param-name>encoding</param-name>
  28. <param-value>utf-8</param-value>
  29. </init-param>
  30. <init-param>
  31. <param-name>forceRequestEncoding</param-name>
  32. <param-value>true</param-value>
  33. </init-param>
  34. <init-param>
  35. <param-name>forceResponseEncoding</param-name>
  36. <param-value>true</param-value>
  37. </init-param>
  38. </filter>
  39. <filter-mapping>
  40. <filter-name>CharacterEncodingFilter</filter-name>
  41. <url-pattern>/*</url-pattern>
  42. </filter-mapping>
  43. </web-app>

2.5 index.jsp

  1. <%@ page contentType="text/html;charset=utf-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>$</title>
  5. </head>
  6. <body>
  7. <p>一个拦截器</p>
  8. <form action="some.do" method="post">
  9. 姓名:<input type="text" name="name"><br/>
  10. 年龄:<input type="text" name="age"><br/>
  11. 操作:<input type="submit" value="提交">
  12. </form>
  13. </body>
  14. </html>

2.6 other.jsp

  1. <%@ page contentType="text/html;charset=utf-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>$</title>
  5. </head>
  6. <body>
  7. /WEB-INF/view/other.jsp,显示request作用域中的数据<br/>
  8. <h3>myName数据:${myName}</h3>
  9. <h3>myAge数据:${myAge}</h3>
  10. <h3>myDate数据:${myDate}</h3>
  11. </body>
  12. </html>

2.7 执行结果

2.7.1 访问index.jsp的页面

2.7.2 在index.jsp页面提交用户请求、转到other.jsp的页面 

2.7.3 IDEA中得到拦截器类的输出结果 

IDEA中的输出结果,大家对照拦截器类中的注释,就可以看懂啦!!!

当拦截器类中的 preHandle 方法返回 true 时,请求的执行顺序:用户发起some.do → preHandle → 控制器的doSome方法 → postHandle → afterCompletion。

当拦截器类中的 preHandle 方法返回 false 时,请求仅仅只会执行 preHandle 方法。


3.多个拦截器的实例

3.1 控制器类

  1. package com.songzihao.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.servlet.ModelAndView;
  5. import javax.servlet.http.HttpSession;
  6. /**
  7. *
  8. */
  9. @Controller
  10. public class MyController {
  11. @RequestMapping(value = "/some.do")
  12. public ModelAndView doSome(HttpSession session,String name, Integer age) {
  13. System.out.println("执行了MyController的doSome()方法");
  14. ModelAndView mv=new ModelAndView();
  15. mv.addObject("myName",name);
  16. mv.addObject("myAge",age);
  17. mv.setViewName("result");
  18. return mv;
  19. }
  20. }

3.2 两个拦截器类

  1. package com.songzihao.handler;
  2. import org.springframework.web.servlet.HandlerInterceptor;
  3. import org.springframework.web.servlet.ModelAndView;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. /**
  7. *
  8. */
  9. public class MyInterceptor implements HandlerInterceptor {
  10. @Override
  11. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  12. System.out.println("===MyInterceptor111111拦截器的preHandle===");
  13. return true;
  14. }
  15. @Override
  16. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv) throws Exception {
  17. System.out.println("===MyInterceptor111111拦截器的postHandle===");
  18. }
  19. @Override
  20. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  21. System.out.println("===MyInterceptor111111拦截器的afterCompletion===");
  22. }
  23. }
  1. package com.songzihao.handler;
  2. import org.springframework.web.servlet.HandlerInterceptor;
  3. import org.springframework.web.servlet.ModelAndView;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. /**
  7. *
  8. */
  9. public class MyInterceptor2 implements HandlerInterceptor {
  10. @Override
  11. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  12. System.out.println("===MyInterceptor222222拦截器的preHandle===");
  13. return true;
  14. }
  15. @Override
  16. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv) throws Exception {
  17. System.out.println("===MyInterceptor222222拦截器的postHandle===");
  18. }
  19. @Override
  20. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  21. System.out.println("===MyInterceptor222222拦截器的afterCompletion===");
  22. }
  23. }

3.3 springmvc配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
  7. <!-- springmvc的配置文件 -->
  8. <context:component-scan base-package="com.songzihao.controller" />
  9. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  10. <property name="prefix" value="/WEB-INF/view/" />
  11. <property name="suffix" value=".jsp" />
  12. </bean>
  13. <mvc:annotation-driven />
  14. <!-- 声明拦截器 -->
  15. <mvc:interceptors>
  16. <!-- 声明第一个拦截器 -->
  17. <mvc:interceptor>
  18. <!--
  19. 指定拦截器的拦截地址
  20. path: 拦截器的uri地址,使用 ** 通配符
  21. -->
  22. <mvc:mapping path="/**"/>
  23. <!-- 指定使用的拦截器 -->
  24. <bean class="com.songzihao.handler.MyInterceptor" />
  25. </mvc:interceptor>
  26. <!-- 声明第二个拦截器 -->
  27. <mvc:interceptor>
  28. <mvc:mapping path="/**"/>
  29. <bean class="com.songzihao.handler.MyInterceptor2"/>
  30. </mvc:interceptor>
  31. </mvc:interceptors>
  32. </beans>

3.4web.xml文件与上面的例子相同

3.5 index.jsp

  1. <%@ page contentType="text/html;charset=utf-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>$</title>
  5. </head>
  6. <body>
  7. <p>多个拦截器</p>
  8. <form action="some.do" method="post">
  9. 姓名:<input type="text" name="name"><br/>
  10. 年龄:<input type="text" name="age"><br/>
  11. 操作:<input type="submit" value="提交">
  12. </form>
  13. </body>
  14. </html>

3.6 result.jsp

  1. <%@ page contentType="text/html;charset=utf-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>$</title>
  5. </head>
  6. <body>
  7. /WEB-INF/view/result.jsp,显示request作用域中的数据<br/>
  8. <h3>myName数据:${myName}</h3>
  9. <h3>myAge数据:${myAge}</h3>
  10. </body>
  11. </html>

这两个 jsp 页面只是起到了一个辅助作用,就是发起一个请求,目的是看一下两个拦截器是如何运行输出的。

3.7 运行结果 

当两个拦截器的 preHandle 方法都返回 true 的时候,请求的执行顺序是这样的:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/972884
推荐阅读
相关标签