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

 

posted @ 2019-09-07 14:45  知行乐语  阅读(439)  评论(0编辑  收藏  举报