zoukankan      html  css  js  c++  java
  • 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测试页面时,可以打开无痕窗口来进行测试,虽然测试时每次都需要输入(没有记录),但是可以有效避免浏览器页面缓存带来的问题

  • 相关阅读:
    PHP $_SERVER['HTTP_REFERER'] 获取前一页面的 URL 地址
    LAMP与LNMP架构的区别及其具体的选择说明
    LNMP 与 LAMP 架构的区别及配置解决方案
    LAMP和LNMP,你更愿意选择谁,为什么?
    Storm流计算从入门到精通之技术篇(高并发策略、批处理事务、Trident精解、运维监控、企业场景)
    Zookeeper从入门到精通(开发详解,案例实战,Web界面监控)
    基于Greenplum Hadoop分布式平台的大数据解决方案及商业应用案例剖析
    深入浅出Hive企业级架构优化、Hive Sql优化、压缩和分布式缓存(企业Hadoop应用核心产品)
    深入浅出OpenStack云计算平台管理(nova-compute/network)
    玩转大数据:深入浅出大数据挖掘技术(Apriori算法、Tanagra工具、决策树)
  • 原文地址:https://www.cnblogs.com/gangbalei/p/11480763.html
Copyright © 2011-2022 走看看