SpringBoot 优雅的配置拦截器方式-程序员宅基地

来源:my.oschina.net/bianxin/blog/2876640


其实spring boot拦截器的配置方式和springMVC差不多,只有一些小的改变需要注意下就ok了。

下面主要介绍两种常用的拦截器:

一、基于URL实现的拦截器:

public class LoginInterceptor extends HandlerInterceptorAdapter{
    /**
     * 在请求处理之前进行调用(Controller方法调用之前)
     * 基于URL实现的拦截器
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String path = request.getServletPath();
        if (path.matches(Const.NO_INTERCEPTOR_PATH)) {
            //不需要的拦截直接过
            return true;
        } else {
            // 这写你拦截需要干的事儿,比如取缓存,SESSION,权限判断等
            System.out.println("====================================");
            return true;
        }
    }
}

关键代码:path.matches(Const.NO_INTERCEPTOR_PATH 就是基于正则匹配的url。

/**
 * @author     BianP
 * @explain 常量类
 */
public class Const {

    public static final String SUCCESS = "SUCCESS";
    public static final String ERROR = "ERROR";
    public static final String FIALL = "FIALL";
    /**********************对象和个体****************************/
    public static final String SESSION_USER = "loginedAgent"; // 用户对象
    public static final String SESSION_LOGINID = "sessionLoginID"; // 登录ID
    public static final String SESSION_USERID = "sessionUserID"; // 当前用户对象ID编号

    public static final String SESSION_USERNAME = "sessionUserName"; // 当前用户对象ID编号
    public static final Integer PAGE = 10; // 默认分页数
    public static final String SESSION_URL = "sessionUrl"; // 被记录的url
    public static final String SESSION_SECURITY_CODE = "sessionVerifyCode"; // 登录页验证码
    // 时间 缓存时间
    public static final int TIMEOUT = 1800;// 秒
    public static final String ON_LOGIN = "/logout.htm";
    public static final String LOGIN_OUT = "/toLogout";
    // 不验证URL anon:不验证/authc:受控制的
    public static final String NO_INTERCEPTOR_PATH =".*/((.css)|(.js)|(images)|(login)|(anon)).*";
}

二、基于注解的拦截器

①创建注解:

/**
 * 在需要登录验证的Controller的方法上使用此注解
 */
@Target({ElementType.METHOD})// 可用在方法名上
@Retention(RetentionPolicy.RUNTIME)// 运行时有效
public @interface LoginRequired {

}

②创建拦截器:

public class AuthorityInterceptor extends HandlerInterceptorAdapter{

     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 如果不是映射到方法直接通过
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        // ①:START 方法注解级拦截器
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        // 判断接口是否需要登录
        LoginRequired methodAnnotation = method.getAnnotation(LoginRequired.class);
        // 有 @LoginRequired 注解,需要认证
        if (methodAnnotation != null) {
            // 这写你拦截需要干的事儿,比如取缓存,SESSION,权限判断等
            System.out.println("====================================");
            return true;
        }
        return true;
    }
}

三、把拦截器添加到配置中,相当于SpringMVC时的配置文件干的事儿:

/**
 * 和springmvc的webmvc拦截配置一样
 * @author BIANP
 */
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
        // 拦截所有请求,通过判断是否有 @LoginRequired 注解 决定是否需要登录
        registry.addInterceptor(LoginInterceptor()).addPathPatterns("/**");
        registry.addInterceptor(AuthorityInterceptor()).addPathPatterns("/**");
     }

     @Bean
     public LoginInterceptor LoginInterceptor() {
         return new LoginInterceptor();
     }

     @Bean
     public AuthorityInterceptor AuthorityInterceptor() {
         return new AuthorityInterceptor();
     }
}

1、一定要加@Configuration 这个注解,在启动的时候在会被加载。

2、有一些教程是用的“WebMvcConfigurerAdapter”,不过在spring5.0版本后这个类被丢弃了 WebMvcConfigurerAdapter ,虽然还可以用,但是看起来不好。

3、也有一些教程使用的WebMvcConfigurationSupport,我使用后发现,classpath:/META/resources/,classpath:/resources/,classpath:/static/,classpath:/public/不生效。具体可以原因,大家可以看下源码因为:WebMvcAutoConfiguration上有个条件注解:

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

所以还是建议使用WebMvcConfigurer, 其实springMVC很多东西,都可以搬到springboot中来使用,只需要把配置文件的模式,改成 对应@Configuration 类就好了。

END

Java团长

专注于Java干货分享

扫描上方二维码获取更多Java干货

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44460333/article/details/105131986

智能推荐

C/C++学习笔记丨用C++语言编写贪吃蛇!_c++编写贪吃蛇所用的知识-程序员宅基地

文章浏览阅读312次。游戏描述如下:1.贪吃蛇可以自动直线前进,或者玩家可以通过方向键操纵贪吃蛇上下左右前进,每次前进一格。2.贪吃蛇在规定的区域内活动,当: ①贪吃蛇触碰到墙壁时; ②贪吃蛇的蛇头触碰到蛇身或者蛇尾时; ③玩家的键盘输入不是方向键时; 命令行显示“Game Over!”并且退出游戏。3.贪吃蛇活动的区域内每次随机产生一颗“豆豆”,当贪吃蛇吃到“豆豆”后蛇身增长一格,自动前进时间缩 短100ms(默认是1000ms,且不能少于100ms)。贪吃蛇长度每为8的倍数I..._c++编写贪吃蛇所用的知识

MapReduce论文中文版-程序员宅基地

文章浏览阅读6.3k次。摘要MapReduce是一个编程模型,也是一个处理和生成超大数据集的算法模型的相关实现。用户首先创建一个Map函数处理一个基于 key/value pair的数据集合,输出中间的基于key/value pair的数据集合;然后再创建一个Reduce函数用来合并所有的具有相同中间key值的中间value值。现实世界中有很多满足上述处理模型的例子, 本论文将详细描述这个模型。MapRe_mapreduce论文中文

win10 mfc100u.dll丢失的解决方法_mfc100u dll下载-程序员宅基地

文章浏览阅读1.5k次。转载这位博主_mfc100u dll下载

制作树苺派/香橙派(orangepi) SD卡备份镜像_树苺派系统备份与还原_orange pi 香橙派emmc系统备份方法-程序员宅基地

文章浏览阅读6.7k次,点赞6次,收藏40次。操作扯扯淡新的改变准备工具正式开干1、将sd卡装入读卡器,然后插上电脑,挂载到ubuntu2、备份SD卡镜像还原方法一:方法二:总结扯扯淡前面一直是做linux运维以及python相关的知识,前段时间无意间拿到手一块orangepi,即香橙派,一直没有在意,近来有点空就拿出来捣鼓一下。树莓派、香橙派、香蕉派这些以水果称呼的嵌入式开发板让人听起来有种不一样的味道,但是许多人对于树莓派与香蕉派很容..._orange pi 香橙派emmc系统备份方法

【语音识别】声纹识别系统(带面板)【含GUI Matlab源码 1022期】-程序员宅基地

文章浏览阅读552次,点赞28次,收藏27次。声纹识别系统(带面板)完整的代码,包运行;运行操作视频见CSDN资源!适合小白!

如何为应用选择最佳的FPGA(上)_fpga封装-程序员宅基地

文章浏览阅读1k次。另一方面,更高端的“重磅”FPGA价格非常昂贵。但这些FPGA的目标应用领域是那些用户愿意为昂贵的FPGA付费的应用,因为他们拥有尖端的技术和能力。例如,这些FPGA应用于顶级军用雷达、下一代无线技术、先进的数字信号处理、数据中心加速等。对于这些细分市场,成本并不是一个重大的交易破坏者。相反,他们对保持技术实力和能力的前沿感兴趣,领先于竞争对手或对手。..._fpga封装

随便推点

mybatis 使用for update,对数据进行行级锁定_mybatis for update-程序员宅基地

文章浏览阅读4.6w次,点赞5次,收藏44次。for upate使用场景在Spring Date JPA之 for update中已经介绍过了,想要了解,可以看博客:https://blog.csdn.net/zc_ad/article/details/83578487,在这边会介绍一下在mybatis中的使用场景。使用了mybatis-plus,前面有些过基础教程,地址:https://blog.csdn.net/zc_ad/article..._mybatis for update

C语言函数的定义、声明、分类以及调用(一)_c语言函数声明-程序员宅基地

文章浏览阅读1.9k次,点赞2次,收藏7次。多维数组名也可以作为函数实参,此时被调用函数中形参数组可以指定每一维的大小,也可省略第一维的大小,但第二维的大小不能省略,而且要和实参数组第二维的大小相同。1、使用数组元素作为实参,在循环语句控制下将数组元素a[i]的值传递给形参x,并将其值减32后保存数数组元素b[i]中,调用函数时,形参x的值发生了改变,而实参a[i]的值并没有发生变化。由于数组名表示数组的首地址,因此实参向形参传递的不是数组的值,而是实参的首地址,这样的形参数组和实参数组共占用相同的内存单元。1、函数的定义、声明、分类以及调用。_c语言函数声明

python爬取表情包图片_res=requests.get(img[i][1]) with open('images/'+ti-程序员宅基地

文章浏览阅读487次。上次写了爬取笔趣阁小说,这次来爬点常用的表情包图片。_res=requests.get(img[i][1]) with open('images/'+title[i]+'.jpg','wb') as f:

阅读笔记(last book—ROS书籍⑥)《ROS By Example v1》A Do-It-Yourself Guide to the Robot Operating System_rod by example 1-程序员宅基地

文章浏览阅读701次。这本书是比较经典的学习ROS的书,但是感觉对于初学者来说并不能作为第一本书籍来阅读,像我是个技术小白,一开始拿出这本书来读总是感觉云里雾里,包括现在读v2版本也有同样的感觉。1. 此书的开篇回答了一个关键性的问题:学习ROS从哪里开始?阶段1:学习基本概念和编程技巧其中,在阶段1,可以参考ROS Wiki来查阅安装说明和初学者教程同时,还需要掌握TF坐标变换以理解ROS如何处理不同的框架使用ROS Answers提问阶段2:使用ROS来控制机器人在阶段2:参考本书,通过ROS使机_rod by example 1

Unity官方案例学习——游戏设计理念(游戏的灵魂)-程序员宅基地

文章浏览阅读1.8k次。何为游戏设计理念和游戏中的用户体验?因为以前做的项目大多都是单一功能的完成,没太考虑设计的理念和用户体验,并且我做的大多是UI界面的实现,或者完成简单的数据添加等等,自己没有一套完整的项目经验;我们unity前端、unity程序员、或者想要做游戏的童鞋,再面试的时候,很多公司要求是完成的项目经验者优先,或者大家去一些招聘的APP上看一下,对于整套的游戏设计我们应该有个明确的思路,而制定这个游戏的思路就是设计理念;而所谓的用户体验,就是游戏中玩家在玩游戏过程中对游戏本身玩法、游戏机制、人物、甚至是光照、UI_游戏设计理念

Spring Boot集成smart-doc生成api文档_com.github.shalousun-程序员宅基地

文章浏览阅读9.4k次,点赞5次,收藏24次。mart-doc是一个java restful api文档生成工具,smart-doc颠覆了传统类似swagger这种大量采用注解侵入来生成文档的实现方法。smart-doc完全基于接口源码分析来生成接口文档,完全做到零注解侵入,你只需要按照java标准注释的写,smart-doc就能帮你生成一个简易明了的markdown或是一个像GitBook样式的静态html文档。下面将介绍如何在Spring......_com.github.shalousun

推荐文章

热门文章

相关标签