• SpringMVC:拦截器(动力)


     

     

     

     

     

     

     

     

    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的核心对象DispatcherServlet-->
    7. <servlet>
    8. <servlet-name>myweb</servlet-name>
    9. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    10. <!-- 自定义springmvc读取的配置文件的位置-->
    11. <init-param>
    12. <!--springmvc的配置文件属性-->
    13. <param-name>contextConfigLocation</param-name>
    14. <!-- 指定自定义文件的位置-->
    15. <param-value>classpath:springmvc.xml</param-value>
    16. </init-param>
    17. <!-- 在tomcat启动后,创建Servlet对象
    18. load-on-startup:表示tomcat启动后创建对象的顺序,它的值是正数,数值越小 tomacat创建对象越早
    19. -->
    20. <load-on-startup>1</load-on-startup>
    21. </servlet>
    22. <!-- 所有的*..do请求交给myweb中央处理器处理-->
    23. <servlet-mapping>
    24. <servlet-name>myweb</servlet-name>
    25. <url-pattern>*.do</url-pattern>
    26. </servlet-mapping>
    27. <!--注册声明过滤器,解决post请求乱码问题-->
    28. <filter>
    29. <filter-name>characterEncodingFilter</filter-name>
    30. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    31. <!--设置项目中使用的编码-->
    32. <init-param>
    33. <param-name>encoding</param-name>
    34. <param-value>utf-8</param-value>
    35. </init-param>
    36. <!--强制请求对象(HttpServletRequest)使用encoding编码的值-->
    37. <init-param>
    38. <param-name>forceRequestEncoding</param-name>
    39. <param-value>true</param-value>
    40. </init-param>
    41. <!--强制应答对象(HttpServletResponse)使用encoding编码的值-->
    42. <init-param>
    43. <param-name>forceReponsetEncoding</param-name>
    44. <param-value>true</param-value>
    45. </init-param>
    46. </filter>
    47. <filter-mapping>
    48. <filter-name>characterEncodingFilter</filter-name>
    49. <!--
    50. /*:表示强制所有的请求先通过过滤器处理
    51. -->
    52. <url-pattern>/*</url-pattern>
    53. </filter-mapping>
    54. </web-app>

     springmvc.xml:声明拦截器

    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. <!-- 用了注解需要注解扫描器:声明组件扫描器:包扫描-->
    8. <context:component-scan base-package="com.bjpowernode.controller"/>
    9. <!-- 声明springmvc框架中的视图解析器,帮助开发人员设置视图文件的路径-->
    10. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    11. <!-- 前缀:视图文件的路径-->
    12. <property name="prefix" value="/WEB-INF/view/"/>
    13. <!-- 后缀:视图文件的扩展名-->
    14. <property name="suffix" value=".jsp"/>
    15. </bean>
    16. <!--声明拦截器:拦截器可以有0个或多个-->
    17. <mvc:interceptors>
    18. <!--声明第一个拦截器-->
    19. <mvc:interceptor>
    20. <!--
    21. 指定拦截器的请求uri地址
    22. path:就是uri地址,可以通配符 ** 可以表示任意字符、文件或多级目录和目录中的文件
    23. /user/** :以user开头的请求都会诶拦截
    24. /** :所有请求都会被拦截
    25. -->
    26. <mvc:mapping path="/**"/>
    27. <!--声明拦截器对象-->
    28. <bean class="com.bjpowernode.handler.MyInterceptor"/>
    29. </mvc:interceptor>
    30. </mvc:interceptors>
    31. </beans>

    拦截器MyInterceptor:先展示拦截器的第一个方法preHandle方法

    1. package com.bjpowernode.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 java.util.Date;
    7. //拦截器类:拦截用户的请求
    8. public class MyInterceptor implements HandlerInterceptor {
    9. /**
    10. *preHandle预处理方法:
    11. * 重要:是整个项目的入口,门户。当preHandle返回true 请求可以被处理
    12. * preHandle返回false 请求到此方法就被截止
    13. * 参数:
    14. * Object hander:被拦截的对象
    15. * 返回值boolean:
    16. * true:表示请求验证通过,可以执行处理器的方法
    17. * 拦截器的MyInterceptor的preHandle()
    18. * =====打印MyController中的do.some()方法===
    19. * 拦截器的MyInterceptor的postHandle()
    20. * 拦截器的MyInterceptor的afterCompletion()
    21. * false:请求没有通过拦截器验证,请求达到拦截器就截止了。请求没有被处理
    22. * 拦截器的MyInterceptor的preHandle()
    23. *
    24. * 特点:
    25. * 1.该方法是在控制器方法(MyController的doSome方法)之前先执行的,用户的请求先到达此方法。
    26. * 2.在这个方法可以获取请求信息,验证请求是否符合要求。
    27. * 可以验证用户是否登录,验证用户是否有权限访问某个链接地址(url)。
    28. * 如果验证失败,可以截断请求,请求不能被处理。
    29. * 如果验证成功,可以放行请求,此时控制器方法才能执行。
    30. */
    31. @Override
    32. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    33. System.out.println("拦截器的MyInterceptor的preHandle()");
    34. //计算的业务逻辑,根据计算结果,返回true或者false
    35. //当返回false时,给浏览器一个返回结果
    36. //request.getRequestDispatcher("/tips.jsp").forward(request,response);
    37. return true;
    38. }
    39. /**
    40. *postHandle:后处理方法。
    41. * 参数:Object handler表示被拦截的处理器对象MyController
    42. * ModelAndView mv表示处理器方法的返回值
    43. * 特点:
    44. * 1.该方法是在控制器方法(MyController的doSome方法)之后先执行的
    45. * 2.能够获取到处理器方法的返回值ModelAndView,可以修改ModelAndView中的数据和视图,
    46. * 可以影响到最后的执行结果
    47. * 3.主要用来对原来的执行结果做二次修正
    48. */
    49. @Override
    50. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv) throws Exception {
    51. System.out.println("拦截器的MyInterceptor的postHandle()");
    52. }
    53. /* afterCompletion:最后执行的方法
    54. 参数:
    55. Object handler:被拦截器的处理器对象
    56. Exception ex:程序中发生的异常
    57. 特点:
    58. 1.在请求处理完成后执行的。框架中规定当你的视图解析器完成后,对视图执行了forward。
    59. 就认为请求完成。
    60. 2.主要用来做资源回收的工作,程序请求过程中创建了一些对象,在这里可以删除,
    61. 把占用的内存回收。
    62. */
    63. @Override
    64. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    65. System.out.println("拦截器的MyInterceptor的afterCompletion()");
    66. }
    67. }

    MyController:

    1. package com.bjpowernode.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import org.springframework.web.servlet.ModelAndView;
    5. @Controller
    6. public class MyController {
    7. @RequestMapping(value = "/some.do")
    8. public ModelAndView doForword(String name,Integer age) {
    9. System.out.println("=====打印MyController中的do.some()方法===");
    10. //处理some.do请求了,相当于service调用处理完成了
    11. ModelAndView mv=new ModelAndView();
    12. mv.addObject("myname",name);
    13. mv.addObject("myage",age);
    14. mv.setViewName("show");
    15. return mv;
    16. }
    17. }

    show.jsp:

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: DELL
    4. Date: 2022/6/7
    5. Time: 19:01
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    9. <%
    10. String path = request.getContextPath();
    11. String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
    12. %>
    13. <html>
    14. <head>
    15. <title>Title</title>
    16. <base href="<%=basePath%>">
    17. </head>
    18. <body>
    19. <h3>/WEB-INF/view/show.jsp.从request作用域获取数据</h3>
    20. <h3>myname数据:${myname}</h3>
    21. <h3>myage数据:${myage}</h3>
    22. </body>
    23. </html>

    tips.jsp:

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: DELL
    4. Date: 2022/6/25
    5. Time: 8:39
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    9. <%
    10. String path = request.getContextPath();
    11. String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
    12. %>
    13. <html>
    14. <head>
    15. <title>Title</title>
    16. <base href="<%=basePath%>">
    17. </head>
    18. <body>
    19. tips.jsp 请求被拦截,不能被执行
    20. </body>
    21. </html>

     index.jsp:

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: DELL
    4. Date: 2022/6/7
    5. Time: 17:37
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    9. <%
    10. String path = request.getContextPath();
    11. String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
    12. %>
    13. <html>
    14. <head>
    15. <title>Title</title>
    16. <base href="<%=basePath%>">
    17. </head>
    18. <body>
    19. <p>一个拦截器</p>
    20. <form action="some.do" method="post">
    21. 姓名:<input type="text" name="name"><br>
    22. 年龄:<input type="text" name="age"><br>
    23. <input type="submit" value="提交请求">
    24. </form>
    25. </body>
    26. </html>

    当第一个方法的返回值为true时:

     

     

     

    当返回false时:

    request.getRequestDispatcher("/tips.jsp").forward(request,response);
    return false;
    

     

     

     

    MyInterceptor

     第二个方法postHandle():

    1. package com.bjpowernode.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 java.util.Date;
    7. //拦截器类:拦截用户的请求
    8. public class MyInterceptor implements HandlerInterceptor {
    9. /**
    10. *preHandle预处理方法:
    11. * 重要:是整个项目的入口,门户。当preHandle返回true 请求可以被处理
    12. * preHandle返回false 请求到此方法就被截止
    13. * 参数:
    14. * Object hander:被拦截的对象
    15. * 返回值boolean:
    16. * true:表示请求验证通过,可以执行处理器的方法
    17. * 拦截器的MyInterceptor的preHandle()
    18. * =====打印MyController中的do.some()方法===
    19. * 拦截器的MyInterceptor的postHandle()
    20. * 拦截器的MyInterceptor的afterCompletion()
    21. * false:请求没有通过拦截器验证,请求达到拦截器就截止了。请求没有被处理
    22. * 拦截器的MyInterceptor的preHandle()
    23. *
    24. * 特点:
    25. * 1.该方法是在控制器方法(MyController的doSome方法)之前先执行的,用户的请求先到达此方法。
    26. * 2.在这个方法可以获取请求信息,验证请求是否符合要求。
    27. * 可以验证用户是否登录,验证用户是否有权限访问某个链接地址(url)。
    28. * 如果验证失败,可以截断请求,请求不能被处理。
    29. * 如果验证成功,可以放行请求,此时控制器方法才能执行。
    30. */
    31. @Override
    32. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    33. System.out.println("拦截器的MyInterceptor的preHandle()");
    34. //计算的业务逻辑,根据计算结果,返回true或者false
    35. //当返回false时,给浏览器一个返回结果
    36. //request.getRequestDispatcher("/tips.jsp").forward(request,response);
    37. return true;
    38. }
    39. /**
    40. *postHandle:后处理方法。
    41. * 参数:Object handler表示被拦截的处理器对象MyController
    42. * ModelAndView mv表示处理器方法的返回值
    43. * 特点:
    44. * 1.该方法是在控制器方法(MyController的doSome方法)之后先执行的
    45. * 2.能够获取到处理器方法的返回值ModelAndView,可以修改ModelAndView中的数据和视图,
    46. * 可以影响到最后的执行结果
    47. * 3.主要用来对原来的执行结果做二次修正
    48. */
    49. @Override
    50. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv) throws Exception {
    51. System.out.println("拦截器的MyInterceptor的postHandle()");
    52. //对原来的dosome执行结果,进行调整
    53. if (mv!=null){
    54. //修改数据
    55. mv.addObject("mydate",new Date());
    56. //修改视图
    57. mv.setViewName("other");
    58. }
    59. }
    60. /* afterCompletion:最后执行的方法
    61. 参数:
    62. Object handler:被拦截器的处理器对象
    63. Exception ex:程序中发生的异常
    64. 特点:
    65. 1.在请求处理完成后执行的。框架中规定当你的视图解析器完成后,对视图执行了forward。
    66. 就认为请求完成。
    67. 2.主要用来做资源回收的工作,程序请求过程中创建了一些对象,在这里可以删除,
    68. 把占用的内存回收。
    69. */
    70. @Override
    71. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    72. System.out.println("拦截器的MyInterceptor的afterCompletion()");
    73. }
    74. }

    other.jsp:

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: DELL
    4. Date: 2022/6/7
    5. Time: 19:01
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    9. <%
    10. String path = request.getContextPath();
    11. String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
    12. %>
    13. <html>
    14. <head>
    15. <title>Title</title>
    16. <base href="<%=basePath%>">
    17. </head>
    18. <body>
    19. <h3>/WEB-INF/view/other.jsp.从request作用域获取数据</h3>
    20. <h3>myname数据:${myname}</h3>
    21. <h3>myage数据:${myage}</h3>
    22. <h3>拦截器中添加的数据${mydate}</h3>
    23. </body>
    24. </html>

     

    拦截器第三个方法: afterCompletion:

    计算请求处理完成的时间:

    1. package com.bjpowernode.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 java.util.Date;
    7. //拦截器类:拦截用户的请求
    8. public class MyInterceptor implements HandlerInterceptor {
    9. //计算请求的时间,定义成员变量
    10. private long btime=0;
    11. /**
    12. *preHandle预处理方法:
    13. * 重要:是整个项目的入口,门户。当preHandle返回true 请求可以被处理
    14. * preHandle返回false 请求到此方法就被截止
    15. * 参数:
    16. * Object hander:被拦截的对象
    17. * 返回值boolean:
    18. * true:表示请求验证通过,可以执行处理器的方法
    19. * 拦截器的MyInterceptor的preHandle()
    20. * =====打印MyController中的do.some()方法===
    21. * 拦截器的MyInterceptor的postHandle()
    22. * 拦截器的MyInterceptor的afterCompletion()
    23. * false:请求没有通过拦截器验证,请求达到拦截器就截止了。请求没有被处理
    24. * 拦截器的MyInterceptor的preHandle()
    25. *
    26. * 特点:
    27. * 1.该方法是在控制器方法(MyController的doSome方法)之前先执行的,用户的请求先到达此方法。
    28. * 2.在这个方法可以获取请求信息,验证请求是否符合要求。
    29. * 可以验证用户是否登录,验证用户是否有权限访问某个链接地址(url)。
    30. * 如果验证失败,可以截断请求,请求不能被处理。
    31. * 如果验证成功,可以放行请求,此时控制器方法才能执行。
    32. */
    33. @Override
    34. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    35. btime=System.currentTimeMillis();//时间开始
    36. System.out.println("拦截器的MyInterceptor的preHandle()");
    37. //计算的业务逻辑,根据计算结果,返回true或者false
    38. //当返回false时,给浏览器一个返回结果
    39. //request.getRequestDispatcher("/tips.jsp").forward(request,response);
    40. return true;
    41. }
    42. /**
    43. *postHandle:后处理方法。
    44. * 参数:Object handler表示被拦截的处理器对象MyController
    45. * ModelAndView mv表示处理器方法的返回值
    46. * 特点:
    47. * 1.该方法是在控制器方法(MyController的doSome方法)之后先执行的
    48. * 2.能够获取到处理器方法的返回值ModelAndView,可以修改ModelAndView中的数据和视图,
    49. * 可以影响到最后的执行结果
    50. * 3.主要用来对原来的执行结果做二次修正
    51. */
    52. @Override
    53. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv) throws Exception {
    54. System.out.println("拦截器的MyInterceptor的postHandle()");
    55. //对原来的dosome执行结果,进行调整
    56. if (mv!=null){
    57. //修改数据
    58. mv.addObject("mydate",new Date());
    59. //修改视图
    60. mv.setViewName("other");
    61. }
    62. }
    63. /* afterCompletion:最后执行的方法
    64. 参数:
    65. Object handler:被拦截器的处理器对象
    66. Exception ex:程序中发生的异常
    67. 特点:
    68. 1.在请求处理完成后执行的。框架中规定当你的视图解析器完成后,对视图执行了forward。
    69. 就认为请求完成。
    70. 2.主要用来做资源回收的工作,程序请求过程中创建了一些对象,在这里可以删除,
    71. 把占用的内存回收。
    72. */
    73. @Override
    74. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    75. System.out.println("拦截器的MyInterceptor的afterCompletion()");
    76. long etime=System.currentTimeMillis();
    77. System.out.println("计算从preHandle到请求处理完成的时间:"+(etime-btime));
    78. }
    79. }

     

     

    再次发送 :

     

     

     第一次需要的时间较长 ,因为jsp第一次需要编译,请求初始化操作,花费时间较长

    jsp编译成servlet才能使用,在以后访问时jsp已经编译完了,不用在重新编译,时间就花费较少

  • 相关阅读:
    【笔记篇】10仓管系统库内管理——之《实战供应链》
    PCL点云处理之基于FPFH特征的全局配准流程具体实现(二百二十一)
    Vue 路由 ElementUI组件库
    Centos7挂载磁盘(笔记)
    FTP主动模式和被动模式(2)- 防火墙对FTP的影响 ASPF
    国庆作业day6
    27.在springboot中使用thymeleaf的属性inline(text, javascript 和 none)
    Go语言入门【5】数组
    AL-实体抽取主动学习调研
    scannet v2 数据集下载
  • 原文地址:https://blog.csdn.net/dengfengling999/article/details/125455193