• 用SptingBoot实现拦截器功能


    介绍

    拦截器(Interceptor),主要完成请求参数的解析、将页面表单参数赋给值栈中相应属性、执行功能检验、程序异常调试等工作。

    具体操作步骤

    拦截器功能,就是一个拦截请求(controller)前中后的操作,登录的时候,把用户信息储存在Session中,没有拦截器的话,你不登录,也可以直接访问你的主页面,添加登录拦截的话,在每个链接前先判断当前用户是否登录存入了一个Session,没有的话,就跳转到登录页面,实现了安全,这里我也是简单的判断了一下,用户是否登录了

    一、实现拦截功能(Springboot通过实现HandlerInterceptor接口实现拦截器功能)

    preHandle: 预先处理,在目标的controller方法执行之前,进行处理

    postHandle: 在目标的controller方法执行之后,到达指定页面之前进行处理

    afterCompletion: 在页面渲染之后进行处理

    @Slf4j
    @Component
    public class LoginInterceptor implements HandlerInterceptor {
        /**
         * 目标方法执行前
         * 该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作
         * 返回 true 表示继续向下执行,返回 false 表示中断后续操作
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            //查看了链接中是否存入了名为"teacherInfo"的Session,如果存在就说明已经登录了,执行放行处理
            Object loginUser = request.getSession().getAttribute("teacherInfo");
            if (loginUser == null) {
                //未登录,返回登陆页
                request.setAttribute("msg", "您没有权限进行此操作,请先登陆!");
                request.getRequestDispatcher("/").forward(request, response);
                return false;
            } else {
                //放行
                return true;
            }
        }
        /**
         * 目标方法执行后
         * 该方法在控制器处理请求方法调用之后、解析视图之前执行
         * 可以通过此方法对请求域中的模型和视图做进一步修改
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            log.info("postHandle执行{}", modelAndView);
        }
        /**
         * 页面渲染后
         * 该方法在视图渲染结束后执行
         * 可以通过此方法实现资源清理、记录日志信息等工作
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            log.info("afterCompletion执行异常{}", ex);
        }
    }
    
    • 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

    二、注册到容器中(通过WebMvcConfigurer实现一个配置类,再通过@Configuration 注解注入到容器)

    我这里使用@Autowired注解把LoginInterceptor获取到,放入了拦截器配置类中,并在/index/**(这里的**是指/index/后面的所有链接)链接中进行拦截,查看是否有Session(这里是放在LoginInterceptor中进行了判断),不拦截//static/**/index的请求

    注意:如果拦截的是 /** 会拦截一切资源,包括静态资源,需要将静态资源放行 /static/**

    @Configuration
    public class WebConfig implements WebMvcConfigurer{
        @Autowired
        LoginInterceptor loginInterceptor;
     
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            //注册自己的拦截器,并设置拦截的请求路径
            //addPathPatterns为拦截此请求路径的请求
            //excludePathPatterns为不拦截此路径的请求
            registry.addInterceptor(loginInterceptor).addPathPatterns("/index/**").excludePathPatterns("/","/static/**","/index");
        }
     
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    借鉴了:https://blog.csdn.net/weixin_52875557/article/details/123793361
    https://blog.csdn.net/weixin_52120555/article/details/123327175

  • 相关阅读:
    5.中间件
    统一网关Gateway、路由断言工厂、路由过滤器及跨域问题处理
    9月19日学习记录
    Win11无法将值写入注册表项如何解决?
    排序算法-堆排序
    Elasticsearch:使用字节大小的向量节省空间 - 8.6
    Python中enum误用逗号引发的错误
    语法分析出错,不是 GROUP BY 表达式
    Html -- 文字时钟
    网络安全(黑客)自学
  • 原文地址:https://blog.csdn.net/qq_57581439/article/details/125494625