• 【SpringMVC】| SpringMVC拦截器


    目录

    一:SpringMVC拦截器

    1. 拦截器介绍

    2. HandlerInterceptor接口分析

    3. 自定义拦截器实现权限验证


    一:SpringMVC拦截器

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

    1. 拦截器介绍

    (1)拦截器的应用场景 

    针对请求和响应进行的额外的处理,在请求和响应的过程中添加预处理、后处理和最终处理;主要应用在以下场景当中:

    ①日志记录:记录请求信息的日志。

    ②权限检查:如登录检查。

    ③性能检测:检测方法的执行时间。

    (2)拦截器的执行原理

    ①preHandle():在请求被处理之前进行操作;预处理
    ②postHandle():在请求被处理之后,但结果还没有渲染前进行操作,可以改变响应结果;后处理。
    ③afterCompletion:所有的请求响应结束后执行善后工作,清理对象、关闭资源 ;最终处理.。

    (3)拦截器实现的两种方式

    继承HandlerInterceptorAdapter【处理程序拦截适配器】的父类。
    实现HandlerInterceptor【处理程序拦截器】接口,推荐使用实现接口的方式,因为继承是单继承的。

    2. HandlerInterceptor接口分析

    自定义拦截器,需要实现 HandlerInterceptor 接口;并且该接口中含有三个方法:

    (1)preHandle

    该方法在处理器方法执行之前执行。其返回值为 boolean类型,若为 true,则紧接着会执行处理器方法,且会将 afterCompletion()方法放入到一个专门的方法栈中等待执行。

    (2)postHandle

    该方法在处理器方法执行之后执行处理器方法若最终未被执行,则该方法不会执行。由于该方法是在处理器方法执行完后执行,且该方法参数中包含 ModelAndView,所以该方法可以修改处理器方法的处理结果数据,且可以修改跳转方向。

    (3)afterCompletion

    当preHandle()方法返回 true 时,会将该方法放到专门的方法栈中,等到对请求进行响应的所有工作完成之后才执行该方法。即该方法是在中央调度器渲染(数据填充)了响应页面之后执行的,此时对 ModelAndView 再操作也对响应无济于事。afterCompletion 最后执行的方法,清除资源,例如在 Controller 方法中加入数据等。

    3. 自定义拦截器实现权限验证

    (1)改造登录方法,在session中存储用户信息,用于进行权限验证

    细节:一定要注意我们登录界面login.jsp跳转到的是/login还是/login.action;有没有带action直接决定我们后面拦截器exclude-mapping通行的路径带不带.action!

    1. package com.bjpowernode.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import javax.servlet.http.HttpServletRequest;
    5. @Controller
    6. public class WebInfAction {
    7. // 首先要跳转到登录页面
    8. @RequestMapping("/showLogin")
    9. public String submit(){
    10. System.out.println("访问login.jsp进行登录");
    11. return "login";
    12. }
    13. // 跳转到login.jsp后,在进行判断
    14. @RequestMapping("/login")
    15. public String login(String name, String pwd, HttpServletRequest request){ // 与前端保持一致,提交的数据自动吸过来
    16. if ("root".equalsIgnoreCase(name) && "123".equalsIgnoreCase(pwd)){
    17. // 在session中存储用户信息(把name存进去),用于权限验证
    18. request.getSession().setAttribute("user",name);
    19. return "main";
    20. }else {
    21. request.setAttribute("msg","用户名或者密码不正确");
    22. return "login";
    23. }
    24. }
    25. }

    (2)开发拦截器的功能,实现HandlerInterceptor接口,重写preHandle()方法

    1. package com.bjpowernode.interceptor;
    2. import org.springframework.web.servlet.HandlerInterceptor;
    3. import javax.servlet.http.HttpServletRequest;
    4. import javax.servlet.http.HttpServletResponse;
    5. public class LoginInterceptor implements HandlerInterceptor {
    6. // 重写preHandle方法
    7. @Override
    8. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    9. // 是否登录的判断
    10. if(request.getSession().getAttribute("user") == null){ // 能取出来,表示登录过
    11. // 没有登录,打回到登录的页面,并给出提示
    12. request.setAttribute("msg","请先去登录!");
    13. request.getRequestDispatcher("WEB-INF/jsp/login.jsp").forward(request,response);
    14. return false;
    15. }
    16. // 如果登录过,就放行往下走
    17. return true;
    18. }
    19. }

    (3)在springmvc.xml文件中注册拦截器

    拦截器中可以配置一个拦截器链,层层把关;这里我们只需要配置一个,总共配置三部分:

    ①映射要拦截的请求,一般设置为全部拦截。

    ②然后在设置要放行的请求。

    ③配置具体的拦截器实现功能的类。

    1. <mvc:interceptors>
    2. <mvc:interceptor>
    3. <mvc:mapping path="/**"/>
    4. <mvc:exclude-mapping path="/showLogin"/>
    5. <mvc:exclude-mapping path="/login"/>
    6. <bean class="com.bjpowernode.interceptor.LoginInterceptor"/>
    7. mvc:interceptor>
    8. mvc:interceptors>

    (4)测试:

    在登录之前,我们还是知道showMain或者showIndex,直接访问是不能访问的,被拦截了

    在成功登录之后,我们不关闭当前会话,重新开一个窗口, 直接访问就可以访问了

  • 相关阅读:
    ConcurrentHashMap源码解析 3.put() 方法
    机器学习笔记之高斯网络(一)基本介绍
    【Python百日进阶-数据分析】Day117 - Plotly 是免费的吗?
    Java面向对象三大基本特征之继承
    SystemVerilog Assertions应用指南 Chapter1.34 :SVA中的多时钟定义
    计算机毕业设计Java高等数学试卷系统(源码+系统+mysql数据库+lw文档)
    【图像融合】基于RP、CVT、DTCWT、NSCT-SR+DWT-SR+拉普拉斯金字塔算法-SR等实现MRT图像融合附matlab源码
    网络安全-记录web漏洞修复
    RAID和LVM配置指南:创建、扩容和管理RAID设备和逻辑卷的方法
    Tensorflow笔记———循环神经网络RNN
  • 原文地址:https://blog.csdn.net/m0_61933976/article/details/128847189