• 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
  • 相关阅读:
    FITC荧光标记脂多糖 FITC-LPS;CY3、CY5、CY7标记芽霉菌糖/昆布多糖/海洋硫酸多糖/聚二糖/棉籽糖定制合成
    Matlab图像处理-最大类间方差阈值选择法(Otsu)
    UE5 C++自定义Http节点获得Header数据
    自学软件测试1个半月上岸拿5个offer
    YOLOR剪枝【附代码】
    在线漫画app开发,更好地保证用户的个性化体验
    信息学奥赛一本通-编程启蒙3001:【例2.1】Hello World
    泛微 E-Office download.php 任意文件读取漏洞
    抖音短视频矩阵系统搭建
    数据集资源之一:最经典大规模、多样化的自动驾驶视频数据集——BDD100K数据集
  • 原文地址:https://blog.csdn.net/m0_64803878/article/details/132745964