博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Boot 拦截器
阅读量:4678 次
发布时间:2019-06-09

本文共 2355 字,大约阅读时间需要 7 分钟。

一般在做登录功能时,我们都需要使用拦截器做登录拦截,这里记录下在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测试页面时,可以打开无痕窗口来进行测试,虽然测试时每次都需要输入(没有记录),但是可以有效避免浏览器页面缓存带来的问题

 

转载于:https://www.cnblogs.com/gangbalei/p/11480763.html

你可能感兴趣的文章
USACO Section 4.2 The Perfect Stall(二分图匹配)
查看>>
Linked List Cycle II
查看>>
java后台通过Servlet给用户发送手机短信验证码,第一次写勿喷,欢迎转载
查看>>
php多虚拟主机配置
查看>>
软件测试作业1
查看>>
JavaScript———从setTimeout与setInterval到AJAX异步
查看>>
Google Performance工具,你还不会用?Git走起。
查看>>
WScript.Shell对象的run和exec(脚本调用其他程序)
查看>>
Codeforces Round #364 (Div. 2),只有A与B
查看>>
Android版数据结构与算法(二):基于数组的实现ArrayList源码彻底分析
查看>>
Python 学习 --简单购物车程序
查看>>
[poj] 1006 Biorhythms
查看>>
[bzoj4800][Ceoi2015]Ice Hockey World Championship
查看>>
Python 列表 extend() 方法
查看>>
Http请求的构成
查看>>
文档翻译
查看>>
JS常用扩展
查看>>
[BZOJ2963][JLOI2011]飞行路线 分层图+spfa
查看>>
setsockopt 设置socket 详细用法
查看>>
JavaScript逻辑运算符 三元表达式
查看>>