• SpingMVC之拦截器使用详解


    拦截器概述

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

    过滤器和拦截器区别
    过滤器:依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。

    拦截器:依赖于web框架,在实现上基于Java的反射机制,属于**面向切面编程(AOP)**的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。

    拦截器一个有3个回调方法

    preHandle

    预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;

    postHandle

    :后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。

    afterCompletion

    :整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器才会执行afterCompletion。

    具体需要配置拦截器的Controller类

    package com.powernode.controller;
    
    import jakarta.servlet.http.HttpServletRequest;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class WebinfAction {
        @RequestMapping("/showIndex")
        public String showIndex() {
            System.out.println("访问index.jsp");
            System.out.println("到这里了");
            return "index";
        }
    
        @RequestMapping("/showMain")
        public String showMain() {
            System.out.println("访问main.jsp");
            return "main";
        }
    
        @RequestMapping("/showLogin")
        public String showLogin() {
            System.out.println("访问login.jsp");
            return "login";
        }
    
        //登录的业务判断
        @RequestMapping("/login")
        public String login(String name, String pwd, HttpServletRequest request) {
            if ("zar".equalsIgnoreCase(name) && "123".equals(pwd)) {
                //在session中存储用户信息,用于进行权限验证
                request.getSession().setAttribute("users",name);
                return "main";
            } else {
                request.setAttribute("msg", "用户名或者密码不正确");
                return "login";
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    拦截器的实现类LoginInterceptor

    public class LoginInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            //是否登录过判断
            if (request.getSession().getAttribute("users") == null){
                //此时就是没有登录过,打回到登录页面,并没有给出提示
                request.setAttribute("msg","您还没有登录,请先去登录");
                request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
                return false;
            }
            return true;//请求放行
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    注册拦截器的配置文件

    
        <mvc:interceptors>
            <mvc:interceptor>
                
                <mvc:mapping path="/**"/>
                
                <mvc:exclude-mapping path="/showLogin">mvc:exclude-mapping>
                <mvc:exclude-mapping path="/login">mvc:exclude-mapping>
                
                <bean class="com.powernode.interceptor.LoginInterceptor">bean>
            mvc:interceptor>
        mvc:interceptors>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    leetcode:6248. 统计中位数为 K 的子数组【问题转化 + 排序二分】
    internship:项目代码所涉及陌生注解及其作用
    腾讯云标准型S5服务器五年优惠价格表(4核8G和2核4G)
    LuaRadio介绍
    MapReduce Partition 分区
    Spring Boot文档阅读笔记-3 Ways to Add Custom Header in Spring SOAP Request
    CPU调度
    mysql进阶: mysql中的锁(全局锁/表锁/行锁/间隙锁/临键锁/共享锁/排他锁)
    SystemServer进程
    医学影像存储与传输系统(PACS)源码
  • 原文地址:https://blog.csdn.net/m0_64803878/article/details/132745964