zoukankan      html  css  js  c++  java
  • 使用 Spring MVC 的拦截器实现登录功能

    Spring MVC 的处理器拦截器,类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。

    应用场景


    • 日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算 PV 等。
    • 权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面。
    • 性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间。
    • 通用行为:读取 Cookie 得到用户信息并将用户对象放入请求,从而方便后续流程使用。

    这里我们简单实现登录拦截功能。

    Spring MVC 拦截器


    Spring MVC 拦截器需要实现 HandlerInterceptor 接口,该接口定义了 3 个方法,分别为 preHandle()postHandle()afterCompletion(),需要通过重写这 3 个方法来对用户的请求进行拦截处理的。

    • preHandle():该方法在请求处理之前进行调用。该方法的返回值是布尔值 Boolean 类型的,当它返回为 false 时,表示请求结束,后续的 InterceptorController 都不会再执行;当返回值为 true 时,就会继续调用下一个拦截器的 preHandle 方法,如果已经是最后一个拦截器的时候,就会是调用当前请求的 Controller 中的方法。
    • postHandle():只能在当前所属拦截器的 preHandle() 的返回值为 true 的时候,才能被调用。postHandle() 在当前请求进行处理之后,也就是在 Controller 中的方法调用之后执行,但是它会在 DispatcherServlet 进行视图返回渲染之前被调用,所以在这个方法中对 Controller 处理之后的 ModelAndView 对象进行操作。
    • afterCompletion():也是需要当前对应的当前的 preHandle() 的返回值为 true 时才会执行。因此,该方法将在整个请求结束之后,也就是在 DispatcherServlet 渲染了对应的视图之后执行,这个方法的主要作用是用于进行资源清理的工作。

    创建拦截器

    这里以登录拦截器作为演示示例。当未登录时是无法直接访问需要登录权限的操作的,为了做到这个效果,我们使用登录拦截器来判断用户是否登录,如果用户已登录则放行让用户继续操作,否则就将其跳转到登录页。

    创建 LoginInterceptor 拦截器类

    public class LoginInterceptor implements HandlerInterceptor {
    
        public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
    		
            User user = (User) httpServletRequest.getSession().getAttribute("user");
    
            // 判断用户是否登录
            if (user == null) {
                // 用户未登录,重定向到登录页
                httpServletResponse.sendRedirect("/login");
                return false;
            }
    
            // 放行
            return true;
        }
    
        public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
            // 如果是以 login 结尾的请求
            if (modelAndView.getViewName().endsWith("login")) {
                // 则直接重定向到首页不再显示登录页
                httpServletResponse.sendRedirect("/index");
            }
        }
    
        public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    
        }
    }
    

    配置拦截器

    拦截器定义后还需要在 spring-mvc.xml 文件中配置拦截器,代码如下:

    <!-- 拦截器配置,拦截顺序:先执行后定义的,排在第一位的最后执行。-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/static/**"/>
            <mvc:exclude-mapping path="/login"/>
            <bean class="com.antoniopeng.springmvc.web.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
    

    相关配置说明:

    • mvc:interceptor:定义一个拦截器
    • mvc:mapping:映射路径,需要拦截的请求路径
    • mvc:exclude-mapping:需要排除的请求路径,比如登录页本身是不需要拦截的,这里还包括了静态资源路径也是不需要拦截的
    • bean:配置指定的拦截器对象

    更多干货请移步:https://antoniopeng.com

  • 相关阅读:
    Redis5.x五种数据类型常见命令
    Redis5.x安装以及常见数据类型
    《Redis5.x入门教程》正式推出
    PPT制作套路指南
    如何更优雅地对接第三方API
    软件开发要质量还是要效率?
    前后端分离对于开发人员的挑战
    Spring中老生常谈的FactoryBean
    消费端如何保证消息队列MQ的有序消费
    《ElasticSearch6.x实战教程》之实战ELK日志分析系统、多数据源同步
  • 原文地址:https://www.cnblogs.com/antoniopeng/p/14371787.html
Copyright © 2011-2022 走看看