1.SpringSecurity中的过滤核心过滤器介绍
2.请求参数中文乱码解决
3.布隆过滤器(Bloom Filter)详解
4.filter过滤器配置如何不过滤一些页面
5.Shiro源码分析---FilterChain创建过程
6.Gin源码分析 - 中间件(1)- 介绍及使用
SpringSecurity中的核心过滤器介绍
本文将介绍SpringSecurity中常用的过滤器及其加载过程。
一、器源常用的码推码过滤器
常用的过滤器共有个,具体如下:
1. org.springframework.security.web.context.SecurityContextPersistenceFilter:这是荐过第一个过滤器,其重要性不言而喻。滤器它主要使用SecurityContextRepository在session中保存或更新一个SecurityContext,过滤地区选择源码并将SecurityContext提供给后续过滤器使用,器源为后续filter建立所需的码推码上下文。SecurityContext中存储了当前用户的荐过认证和权限信息。
2. org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter:此过滤器用于继承SecurityContext到Spring异步执行机制中的滤器WebAsyncManager,是过滤spring整合必须的。
3. org.springframework.security.web.header.HeaderWriterFilter:向请求的器源header中添加响应的信息,可以在http标签内部使用security:headers来控制。码推码
4. org.springframework.security.web.csrf.CsrfFilter:Csrf又称跨域请求伪造,荐过SpringSecurity会对所有post请求验证是滤器否包含系统生成的csrf的token信息,如果不包含则报错,起到防止csrf攻击的效果。
5. org.springframework.security.web.authentication.logout.LogoutFilter:匹配URL为/logout的linux起始源码请求,实现用户退出,清除认证信息。
6. org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter:认证操作全靠这个过滤器,默认匹配URL为/login且必须为POST请求。
7. org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter:如果没有在配置文件中指定认证页面,则由该过滤器生成一个默认的认证界面。
8. org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter:由此过滤器生成一个默认的退出登录页面。
9. org.springframework.security.web.authentication.www.BasicAuthenticationFilter:此过滤器会自动解析HTTP请求中头部名字为Authentication,且以Basic开头的头部信息。
. org.springframework.security.web.savedrequest.RequestCacheAwareFilter:通过HttpSessionRequestCache内部维护一个RequestCache,用于缓存HttpServletRequest。
. org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter:针对ServletRequest进行一次包装,使得request具有更加丰富的API。
. org.springframework.security.web.authentication.AnonymousAuthenticationFilter:当SecurityContextHolder中认证信息为空,则会创建一个匿名用户存储到SecurityContextHolder中,SpringSecurity为了兼容未登录的访问,也走了一套认证流程,thinkphp 关联 源码只不过是一个匿名的身份。
. org.springframework.security.web.session.SessionManagementFilter:SecurityContextRepository限制同一个用户开启多个会话的数量。
. org.springframework.security.web.access.ExceptionTranslationFilter:异常转换过滤器位于整个SpringSecurityFilterChain的后方,用来转换整个链路中出现的异常。
. org.springframework.security.web.access.intercept.FilterSecurityInterceptor:获取所有配置资源的访问授权信息,根据SecurityContextHolder中存储的用户信息来决定其是否有权限。
二、过滤器加载过程
1. DelegatingFilterProxy:我们在web.xml中配置了一个名称为SpringSecurityFilterChain的过滤器DelegatingFilterProxy,接下来可以查看该源码。
2. FilterChainProxy:通过上面的源码分析我们发现其实创建的是FilterChainProxy这个过滤器,那我们来看下这个过滤器。
3. SecurityFilterChain和DefaultSecurityFilterChain:具体的实现类。
总结:通过上面的代码分析,SpringSecurity中要使用到的过滤器最终都保存在了DefaultSecurityFilterChain对象的List filter对象中。
请求参数中文乱码解决
在处理请求参数时,若参数中含有中文,可能会导致中文乱码问题。ios源码平台为解决Spring框架中此类问题,Spring提供了专门的字符集过滤器——CharacterEncodingFilter类,位于spring-web-5.2.5.RELEASE.jar的org.springframework.web.filter包中。
为有效解决中文乱码问题,需在web.xml文件中注册CharacterEncodingFilter。重要的是,需将此过滤器注册在其他过滤器之前,确保其执行顺序正确。这一步骤能确保所有请求参数正确解码,避免中文乱码现象。
深入源码分析可进一步理解过滤器工作机制。CharacterEncodingFilter通过设置字符编码,确保请求参数正确解析。在Spring框架中,通过调用CharacterEncodingFilter的filter方法,实现对请求参数的字符编码过滤。
在web.xml中注册过滤器的社交源码分享示例代码如下:
xml
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
encodingFilter
/
*通过以上配置,所有请求参数将被正确解码为UTF-8编码。这将有效解决Spring框架中因请求参数中文乱码带来的问题,确保应用运行稳定,数据处理准确无误。
布隆过滤器(Bloom Filter)详解
布隆过滤器(Bloom Filter),一种年由布隆提出的高效数据结构,用于判断元素是否在集合中。其优势在于空间效率和查询速度,但存在误判率和删除难题。布隆过滤器由长二进制数组和多个哈希函数构成,新元素映射位置置1。判断时,若所有映射位置均为1,则认为在集合;有0则判断不在。尽管可能产生误报,但通过位数组节省空间,比如MB内存可处理亿长度数组。常用MurmurHash哈希算法,如mmh3库,它的随机分布特性使其在Redis等系统中广泛使用。
在Scrapy-Redis中,可以将布隆过滤器与redis的bitmap结合,设置位长度为2的次方,通过setbit和getbit操作实现。将自定义的bloomfilter.py文件添加到scrapy_redis源码目录,并在dupefilter.py中进行相应修改。需要注意的是,爬虫结束后可通过redis_conn.delete(key名称)释放空间。使用时,只需将scrapy_redis替换到项目中,遵循常规的Scrapy-Redis设置即可。
filter过滤器配置如何不过滤一些页面
一般我的方法是
判断uri的是不是这三个
如果是这三个,不做处理,直接直接 下一步
=================
唉,直接给你看源码吧
在doFilter方法里写上
String contextPath = InitObjects.getContextPath();
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
//获得用户请求的uri
String uri = httpServletRequest.getRequestURI();
//eccludedPages是个List,存放着比如index.jsp,error.jsp等不需要过滤的页面
if (!excludedPages.contains(uri)) {
}
}
filterChain.doFilter(request, response);
Shiro源码分析---FilterChain创建过程
在Shiro框架中,无论是进行认证还是权限控制,都依赖于过滤器的配置与应用。在实际开发中,可能需要配置多个过滤器,但每个请求所经过的过滤器组合却因请求不同而异。因此,理解一个请求会通过哪些过滤器,对于熟练使用Shiro至关重要。本文将详细解析请求通过的过滤器创建过程。
Shiro框架通过`org.apache.shiro.web.filter.mgt.FilterChainResolver`接口定义了如何确定一个请求应经过哪些过滤器。接口中的唯一方法`getChain`负责查找并组装一个过滤器链(FilterChain),该链包含了请求处理过程中所应用的所有过滤器。`FilterChain`是一个熟知的概念,尤其是对于Servlet开发人员来说,它在日常工作中常见。而`FilterChainResolver`仅是一个接口,Shiro提供了默认实现类`org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver`,该实现类利用请求路径来匹配相应的过滤器。
在深入理解PathMatchingFilterChainResolver的源码前,先来看看FilterChainManager是如何管理和创建FilterChain的。Shiro提供了一个默认的FilterChainManager实现类`org.apache.shiro.web.filter.mgt.DefaultFilterChainManager`。其关键方法`createChain`在系统启动时被调用,用于创建各个FilterChain。以配置示例`/static/**、/formfilterlogin,/role`为例,`chainName`与`chainDefinition`分别代表了需要管理的FilterChain名称与定义。
了解了FilterChainManager的创建与管理机制后,接下来关注FilterChainResolver如何确定请求所需过滤器链。在`DefaultFilterChainManager.proxy`方法中,`NamedFilterList`的实现类`org.apache.shiro.web.filter.mgt.SimpleNamedFilterList`被调用,此步骤是确定过滤器链的关键环节。
至此,Shiro框架中FilterChain创建过程已全面解析完成。如有任何错误或需要进一步讨论的问题,欢迎指正。感谢阅读,期待更多的技术交流。
Gin源码分析 - 中间件(1)- 介绍及使用
中间件在Gin中起着至关重要的作用,它们构成了一条处理HTTP请求的链式结构,实现了代码的解耦和业务分离。本文将深入解析Gin的中间件使用和工作原理。
2.1 中间件的作用
Gin中间件有两个核心功能:一是对请求进行前置拦截,如权限验证和数据过滤;二是对响应进行后置处理,如添加统一头信息或格式化数据。这是它们作为前置过滤器和后置拦截器的角色。
2.2 中间件的实现
在Gin框架中,中间件本质上就是接收gin.Context参数的函数,与处理HTTP请求的Handler并无本质区别,非常直观易懂。
3.1 使用中间件
gin.Default()默认包含了Recovery和Logger中间件,而gin.New()则提供不带中间件的Engine。全局使用可通过gin.Engine的Use()方法,而局部使用则针对路由分组,如user组中使用Logger和Recovery。
4.1 开发自定义中间件
Gin支持自定义中间件,有直接接收Context参数的函数方式和返回HandlerFunc类型的封装方式,后者提供了更好的封装性。
5. 演示与总结
通过实际示例,我们将看到中间件如何串联执行,以及c.Next(), c.Abort(), c.Set(), c.Get()这些方法在处理流程中的作用。下文将深入剖析中间件的代码实现和常用中间件的工作机制。