• Spring Boot 拦截器


    一般在做登录功能时,我们都需要使用拦截器做登录拦截,这里记录下在Spring Boot中做拦截器的过程和注意;

    第一步:首先我们先要实现一个HandlerInterceptor接口来实现拦截器功能

    public class LoginHandlerInterceptor implements HandlerInterceptor {
        /**
         * 在访问Controller之前做检测
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            Object username = request.getSession().getAttribute("username");
            // 用户未登录,跳转到用户界面,要求用户登录
            if (username==null) {
                request.setAttribute("error", "请先登录后才能使用!");
                request.getRequestDispatcher("/login").forward(request, response);
                //response.sendRedirect("/login"); 这个也可以使用,但是不能传递参数
                return false;
            }
            // 用户已经登录,放行请求
            return true;
        }
    }

    第二步:在Spring Boot中,我们需要注册我们的拦截器到容器中,

    这里是实现WebMvcConfigure接口,方便我们自行扩展Spring Boot对Spring MVC的组件支持,实现addInterceptors方法就是用于注册我们的拦截器组件到容器中;

    @Configuration
    // @EnableWebMvc 这个注解会让spring boot的MVC相关的自动配置全部失效
    public class DefineMvcConfig implements WebMvcConfigurer {
    
        // 配置拦截器 addPathPatterns(url):配置拦截的请求  excludePathPatterns(urls...):配置放行的请求
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
                    .excludePathPatterns("/", "/login", "/user/login");
        }
    }

    上面就是Spring Boot实现一个拦截器,但是处理运行项目后,访问页面出现了样式问题(没有配置拦截器之前是没有问题的)

    原因:SpringBoot2.x版本,配置自定义的拦截器之后,会导致对静态资源的访问处理失效,于是需要配置静态资源访问请求放行

    因为我的项目引入静态资源有两处,一处是webjar引入,一处是从static文件夹下引入,于是添加了如下两个放行:

    registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
                    .excludePathPatterns("/", "/login", "/user/login", "/webjars/**", "/static/**");

    再次访问,样式还是部分存在问题,引入 webjar 的静态资源生效了,但引入static的静态资源依然会被拦截 

    在网上查了很多方法,尝试下来都没有解决,最终有一种方式生效了,先记录下来,至于为什么,我也还没有弄清楚,之后再细看下

    完整的拦截器配置如下:把/**都改为/*,就可以让static下文件直接被访问(不会被拦截)

    // 配置拦截器后,SpringBoot2.x需要对静态资源也要做放行处理
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/*")
                    .excludePathPatterns("/", "/login", "/user/login", "/webjars/*");
        }

    这里,提醒大家注意浏览器页面缓存,我配置拦截器后,没有对static静态资源进行处理,结果请求页面居然是可以的,

    于是就继续下一步,不久后请求居然出现样式问题,又到头来解决staitc资源拦截问题。

    页面缓存解决:使用谷歌Chrome测试页面时,可以打开无痕窗口来进行测试,虽然测试时每次都需要输入(没有记录),但是可以有效避免浏览器页面缓存带来的问题

  • 相关阅读:
    客车网上订票系统项目--会员管理、前端注册页面
    客车网上订票系统项目--管理员管理、前端用户留言
    客车网上订票系统项目--新闻模块
    后端模块-管理员登录、显示留言列表
    前端模块--首页留言页编辑
    前端模块--登录注册界面编辑
    JVM深入理解(一) -JVM初识
    45:漏洞发现-API接口服务之漏洞探针类型利用修复
    42:漏洞发现-操作系统之漏洞探针类型利用修复
    linux系统安全-2
  • 原文地址:https://www.cnblogs.com/gangbalei/p/11480763.html
Copyright © 2020-2023  润新知