Spring Boot-Filter过滤器使用
1、基础准备
2、编写Filter
此处我们重点关注 doFilter方法 ,编写实现类重写该方法。
Ⅰ 在自定义Filter实现类上使用@WebFilter注解;
Ⅱ 自定义filterName(随意,不要与其他Filter重复即可);
Ⅲ 定义urlPatterns此处设置为"/*",表示拦截所有请求;
Ⅰ 将传入的 request 与 response 对象转换为 Http类型 ;
Ⅱ 自定义不需要处理的URI数组
Ⅲ 获取请求URI
Ⅳ 判断本次请求
封装checkURI方法,如下:
a、注入PATH_MATCHER,用于路径比较,如下:
b、方法体,如下:
Ⅴ 不需要拦截,则直接放行
Ⅵ 其余路径,判断登录状态
a、已登录,则放行
BaseContext是自定义存储线程userId的类
b、未登录,拦截
自定义常量
拦截,此处使用response向前端返回响应数据R.error(NOT_LOGIN)
3、扫描Filter
在启动类上添加 @ServletComponentScan注解 ,用于扫描 @WebFilter 注解 ,如下:
4、测试
编写Controller类,启动测试。
以上即为Filter基础使用的内容,感谢阅读。
「干货」SpringBoot+SpringSecurity+Jwt权限认证-认证
启动项目时,SpringBoot自动检索所有带@Configuration的注解,所以就将我们的WebSecurityConfig给加载了,这个config中,我们需要在configure(AuthenticationManagerBuilder auth)方法中注册一个继承自UserDetailsService的接口,这个接口中只有一个方法,那就是使用username获取到数据库中用户信息并返回成UserDetail实体。这个方法需要我们按照我们的不同业务场景重写
WebSecurityConfig
MyUserDetailsService
其实如果去掉上面的将自定义的JWT过滤器加入到过滤链中的话,这个认证过程已经完成了。使用下面的代码就可以调用起整个认证程序。
核心代码
这一行就会将username和password放到认证程序中进行认证。
也就是需要我们自己的逻辑让他去触发这个代码的实现。就可以自动完成认证程序了。就会触发使用username获取到数据库用户信息,然后经过密码加密比对之后会将认证结果返回。
我们整合JWT其实也很简单,其实就是将JWT的登录部分的操作,使用过滤器封装,将该过滤器放到整个认证的过滤链中
SpringSecurity过滤器的配置无非以下几个条件
先解决逻辑上以上三个问题的答案
针对以上解答,下面用代码来做展示(ps:序号依次对应上面)
完成了以上的配置,前台就可以使用/login/user来进行登录操作了。登录成功会返回一个JSON对象来供前端判断成功与否
全部代码奉上,随意写的注释有点多,不看的可以给删掉
SpringBoot系列:4.session和鉴权—过滤器和拦截器
本文主要介绍下,SpringBoot的web项目中,
使用redis保存并共享session,可以实现集群内的登录信息共享。SpringBoot项目中,通过在 application.yml 增加redis的配置,即可实现对session的存储和修改。
那么session是在何时被处理的?session的key又是如何生成的呢?这里实际使用了web项目中的过滤器。
在SpringBoot的web项目中,启动的tomcat在处理http请求时,有一个很重要的类: ApplicationFilterChain 。每个http请求在处理时都会通过这个类。这个类负责按顺序处理全部已注册的 Filter ,也就是过滤器。通过实现tomcat中的 Filter 接口,就可以定义一个过滤器。
在SpringBoot中的web项目中,有几个默认的过滤器,其中一个就是用来处理session的: SessionRepositoryFilter
SessionRepositoryFilter 主要的成员是两个接口,都有多个可选的实现类,通过这两个成员就实现了对session的解析。
当然也可以实现一个自己的过滤器,主要有两种方式:
下面我们使用第一种方式实现一个限制指定IP的过滤器:
通过过滤器解析session后,就可以根据session中保存的内容,判断当前登录的用户权限。
这里是通过一个拦截器实现的,在拦截器中可以直接通过 HttpServletRequest.getSession() 方法直接获取session的信息。
一个简单的拦截器实现如下:
定义之后要注册到处理流程中:
先来看下过滤器和拦截器的执行顺序,通过debug得到的执行顺序如下图:
在大部分场景中,过滤器和拦截器都是可互换的,使用哪个都可以。
过滤器和拦截器也有些区别,这里不谈实现和规范的差异,就说下使用中可能涉及的区别:
最后对于过滤器和拦截器的应用场景,说下个人的总结。基于执行顺序,方法参数和SpringBoot中的一些实现类来看。
以上内容属个人学习总结,如有不当之处,欢迎在评论中指正
SpringBoot 手写过滤器&加载第三方过滤器
他们三个各有优缺点,需要根据自己的业务需求来选择最适合的拦截机制。
好了下面开始正文。
好了,开始正文。
特别容易,继承Filter ,然后根据需求重写它的三个方法。
其中 init方法是初始化方法,最先执行。
然后执行doFilter方法,熟悉servlet的应该都知道,它其实就是调用业务。
最后destroy方法,是最后执行的。
然后我们启动服务,随便调用一个controller,控制台打印如下:
一般在开发的时候,我们可能用到第三方的过滤器,我们不可能在其源码上添加 @Component 注解。所以我们必须写一个配置类来引入它。
下面我们把上面的例子当作第三方过滤器,把TimeFilter类上面的@Component注解去掉。做一个模拟练习。
注意一定要去掉TimeFilter类上面的@Component注解,否则过滤器会失效。
SpringCloud
springboot
nginx
redis
Java NIO教程
Java reflection 反射详解
Java并发学习笔录
Java Servlet教程
jdbc组件详解
Java NIO教程
Java语言/版本 研究
Spring Boot 在升级到 2.4 的时候 EnableResourceServer 提示将会丢弃
在升级 Spring Boot 从 2.3.3 到 2.4 的时候提示:
@EnableResourceServer
将会被丢弃。
@EnableResourceServer开启资源服务配置,会配置资源服务相关的安全配置。
一个资源服务(可以和授权服务在同一个应用中,当然也可以分离开成为两个不同的应用程序)提供一些受token令牌保护的资源,Spring OAuth提供者是通过Spring Security authentication filter 即验证过滤器来实现的保护,你可以通过@EnableResourceServer注解到一个@Configuration配置类上,并且必须使用 ResourceServerConfigurer 这个配置对象来进行配置
Convenient annotation for OAuth2 Resource Servers, enabling a Spring Security filter that authenticates requests via an incoming OAuth2 token.
需要在升级的时候注意这个将要丢弃的版本。
springboot过滤器 springboot过滤器原理
CAS-5.3单点登录/退出客户端搭建(Springboot)
使用Springboot搭建cas客户端,主要是配置四个过滤器和一个监听器。
用于过滤不需要登录的用户,需要实现UrlPatternMatcherStrategy 接口,在matches 函数里添加不需要用户登录的链接。
按照同样的方法实现客户端系统2。
启动cas服务器端和两个客户端。输入 ,则跳转到登录界面
单点退出,需要下面三个步骤:1、添加过滤器类,过滤掉不需要登录的url;2、添加退出跳转的控制器;3、修改服务端application.properties ,加cas.logout.followServiceRedirects=true,让客户端可以自己制定退出的路径,否则会走默认退出路径。
过滤器类需要实现UrlPatternMatcherStrategy接口,然后配置到springboot中,请参考 单点登录 的 创建过滤器类 和 配置过滤器到springboot 。
退出的方式有两种,一种是走默认的路径,另一种是走自定义的返回路径。请参考 单点登录 的 用户退出控制器 。
将上面的内容添加到applicaiton.properties, 这样就可以允许客户端定制自己的退出路径了。
http协议配置:cas 5.3.x默认客户端不支持http协议, 如果不进行配置,则会出现“未认证授权的服务”错误。
要配置兼容http协议,需要在HTTPSandIMAPS-10000001.json文件中添加http。
45. 从零开始学springboot撸一个Xss过滤器-注解实现
上章通过Filter实现了Xss全局过滤器
可能小伙伴还有点不满, 全局意味着“一刀切”,
虽然我们也有白名单黑名单设置, 但是, 白名单黑名单针对的是整个方法或整个实体类
举个例子, 我定义了个实体
可能业务上有限制(比如name限制了只有5个字符长),
那么name其实不可能存在Xss注入风险了,
程序只需要对info和des属性做转义即可
如果采用Filter, 意味着People的所有属性都会检测转义, 好像没啥必要!
那么, 可以针对性的指定字段进行Xss的过滤转义么?
为了应对这样的需求, 咸鱼君采用Aop注解来实现这么个Xss过滤器.
PS: 和Filter一样, 我们统一对入参Xss过滤, 确保参数的处理方式统一! 所以, 程序中获取的参数值都是转义后的数据!!
废话不多说, 往下看!
加入必要的pom依赖
针对方法, 参数, 属性分别定义三个注解
XssMethod
XssParam
XssField
针对注解实现切面Aspect
XssAspect
注释写的很详细, 就不多废话了!
接下来我们写个案例来测试测试
首先在启动类上启用切面
定义一个实体People, 并对info,des属性加上注解进行xss过滤
最后编写controller
json方式
键值对方式
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, website.service08@gmail.com 举报,一经查实,本站将立刻删除。