1.【Recast Navigation】SoloMesh源码分析(三)——行走面过滤
2.Python和Django的过滤过滤基于协同过滤算法的**推荐系统源码及使用手册
3.Spring Boot ä¹ Filter
4.Shiro源码分析---FilterChain创建过程
5.icmp数据包的过滤主要基于
6.SpringSecurity中的核心过滤器介绍
【Recast Navigation】SoloMesh源码分析(三)——行走面过滤
本文是对SoloMesh源码分析系列文章的第三部分,主题为行走面过滤。源码此阶段的过滤过滤处理是对体素化后Heightfield的修正和标记,旨在优化导航网格的源码构建过程。
行走面过滤分为三个主要步骤:过滤悬空的过滤过滤可走障碍物、过滤高度差过大的源码stochastics指标源码span以及过滤不可通过高度span。
首先,过滤过滤过滤悬空的源码可走障碍物通过函数rcFilterLowHangingWalkableObstacles实现。此过程识别上下两个体素,过滤过滤其中下体素可行走,源码而上体素不可行走。过滤过滤若上下两体素上表面相差不超过walkClimb,源码则将上体素标记为可行走。过滤过滤
接着,源码过滤高度差过大的过滤过滤span通过rcFilterLedgeSpans函数完成。此过程寻找如图所示的两种情况。首先,确保上span与下span与邻居的上span下span之间存在超过walkHeight的空隙,表明可通过一个agent的高度。然后,根据两种不同的情况,对体素进行判断,-50的源码以解决转角台阶的识别问题。实际上,该步骤的目的是通过补充斜向体素的考虑,解决体素连接关系仅考虑4方邻居的问题。然而,该方法存在影响同方向体素的副作用,即图示的错误例子。解决这一问题的方法是排除同方向的两个体素比较。
最后,过滤不可通过高度span通过rcFilterWalkableLowHeightSpans实现。此过程检查上下两个span之间空隙,若小于等于walkHeight,则将下span标记为不可行走。
总结:代码逻辑相对简单,具体实现细节可直接在github的wcqdong/recastnavigation项目中查看源码注释,以深入理解此阶段的详细处理流程。
Python和Django的基于协同过滤算法的**推荐系统源码及使用手册
软件及版本
以下为开发相关的技术和软件版本:
服务端:Python 3.9
Web框架:Django 4
数据库:Sqlite / Mysql
开发工具IDE:Pycharm
**推荐系统算法的实现过程
本系统采用用户的历史评分数据与**之间的相似度实现推荐算法。
具体来说,这是基于协同过滤(Collaborative Filtering)的一种方法,具体使用的是基于项目的协同过滤。
以下是赤色要塞源码系统推荐算法的实现步骤:
1. 数据准备:首先,从数据库中获取所有用户的评分数据,存储在Myrating模型中,包含用户ID、**ID和评分。使用pandas库将这些数据转换为DataFrame。
2. 构建评分矩阵:使用用户的评分数据构建评分矩阵,行代表用户,列代表**,矩阵中的元素表示用户对**的评分。
3. 计算**相似度:计算**之间的相似度矩阵,通常通过皮尔逊相关系数(Pearson correlation coefficient)来衡量。
4. 处理新用户:对于新用户,推荐一个默认**(ID为的**),创建初始评分记录。
5. 生成推荐列表:计算其他用户的评分与当前用户的评分之间的相似度,使用这些相似度加权其他用户的评分,预测当前用户可能对未观看**的评分。
6. 选择推荐**:从推荐列表中选择前部**作为推荐结果。
7. 渲染推荐结果:将推荐的**列表传递给模板,并渲染成HTML页面展示给用户。
系统功能模块
主页**列表、七搭配源码**详情、**评分、**收藏、**推荐、注册、登录
项目文件结构核心功能代码
显示**详情评分及收藏功能视图、根据用户评分获取相似**、推荐**视图函数
系统源码及运行手册
下载并解压源文件后,使用Pycharm打开文件夹movie_recommender。
在Pycharm中,按照以下步骤运行系统:
1. 创建虚拟环境:在Pycharm的Terminal终端输入命令:python -m venv venv
2. 进入虚拟环境:在Pycharm的Terminal终端输入命令:venv\Scripts\activate.bat
3. 安装必须依赖包:在终端输入命令:pip install -r requirements.txt -i /simple
4. 运行程序:直接运行程序(连接sqllite数据库)或连接MySQL。
Spring Boot ä¹ Filter
Filteræ¯request/responseæ§è¡è¿æ»¤ä»»å¡ç对象ï¼èµæºå¯ä»¥æ¯ä¸ä¸ªservletæè éæèµæºãFilterå¨ doFilter æ¹æ³ä¸æ§è¡è¿æ»¤é»è¾ãæ¯ä¸ªFilteré½æä¸ä¸ªFilterConfig对象ï¼å¯ä»¥ä»FilterConfig对象è·ååå§ååæ°åServletContextå¼ç¨ãFilterå·¥ä½å¨å®¢æ·ç«¯åServletä¹é´ï¼å¯ä»¥å¯¹å®¢æ·ç«¯request以åæå¡å¨çresponseè¿è¡å¤çï¼åºäºæ¤Filterå¯ä»¥ç¨äºå®ç°ä»¥ä¸åè½ï¼
å®ä¹ä¸ä¸ªFilteréè¦ javax.servlet.Filter æ¥å£ï¼ Filter æå¦ä¸ä¸ä¸ªæ¹æ³ï¼
ä¸é¢å®ä¹ä¸ä¸ªç®åçFilterï¼å¨ init() æ¹æ³ä¸åå§åFilterçååï¼å¨ doFilter æ¹æ³ä¸ç®åçè®°å½Filter被è°ç¨ï¼ destroy() ç®åçè®°å½æ¹æ³è¢«è°ç¨ã
FirstFilterï¼
å¨å®æFilterçå建åï¼è¿éè¦å°Filter注åå°Web容å¨ï¼æ·»å å°Filter chainï¼æè½å¯¹request/responseè¿è¡è¿æ»¤ãå¨Spring Bootä¸æ³¨åFilteré常ç®åï¼ä¸é¢æ¯ä¸ä¸ªç®å注åFilterçæ ·ä¾ï¼
å¯å¨Spring Boot并è°ç¨ä¸ä¸ªæµè¯æ¥å£ï¼æµè¯æ¥å£å¯ä» è¿é è·åã
åºç¨çè¾åºå¦ä¸ï¼
ä»è¾åºä¸å¯ä»¥çåºFilterå®æäºåå§åï¼Filterçååæ¯âfirst filterâã
å¦æå®ä¹äºå¤ä¸ªFilterï¼å¹¶æærequest/responseå¯ä»¥æç §è®¾å®ç顺åºä¾æ¬¡ç»è¿å个Filterï¼ä¾å¦ï¼requestéè¦å ç»è¿é´æFilterï¼é´æéè¿ååè¿å ¥åæ°æ ¡éªFilterçï¼ï¼è¿ç§æ åµå¦ä½ä¿è¯Filterçæ§è¡é¡ºåºå¢ï¼å¨æ³¨åFilterçæ¶åå¯ä»¥ç»æ¯ä¸ªFilter设置ä¸ä¸ªæ°å表示çorderï¼å¼è¶å°Filterå¨chainä¸çä½ç½®è¶é åã为äºä¸¥éFilterçæ§è¡é¡ºåºï¼æ们å®ä¹ç¬¬äºä¸ªFilterï¼SecondFilterï¼æºç å¯ä» è¿é è·åãç¶åå°ä¸¤ä¸ªFilteræ·»å å°Web容å¨ä¸ï¼
å¯å¨Spring Boot并è°ç¨ä¸ä¸ªæµè¯æ¥å£ï¼æµè¯æ¥å£å¯ä» è¿é è·åã
åºç¨çè¾åºå¦ä¸ï¼
requestä¾æ¬¡ç»è¿first filter -> second filterï¼responseä¾æ¬¡ç»è¿second filter - > first filterï¼Filterçæ§è¡é¡ºåºæ»¡è¶³æ们çææã
éè¿ä¸é¢å¦ä¹ çç¥è¯ï¼æ们å®ç°ä¸ä¸ªé´æçFilterãå设客æ·ç«¯è®¿é®èµæºæ¶éè¦å¨è¯·æ±çheaderä¸æºå¸¦ä¸¤ä¸ªåæ°ï¼useråpasswordï¼çæç¯å¢æºå¸¦è´¦å·å¯ç æ¯ååå±é©çï¼åºè¯¥èèåºäºTokençé´æï¼ï¼å¦ææä¸ä¸ªåæ°æ²¡ææºå¸¦åè¿å客æ·ç«¯é误ç请æ±ï¼ Bad Requestï¼ï¼å¦æuseråpasswordä¸å¹é æç³»ç»ä¸åå¨ç¨æ·åè¿åæ æè®¿é® ï¼ Forbiddenï¼ã客æ·ç«¯æ¯æåä¸æ¬¡ï¼ç³»ç»é½ä¼è®°å½ç¨æ·ç访é®æ¬¡æ°ã
Filterçå®ç°å¦ä¸ï¼
è¿æ»¤æ¥éª¤ï¼
å®æ´çæºç å¯ä»¥ä» è¿é è·åã
Shiro源码分析---FilterChain创建过程
在Shiro框架中,无论是进行认证还是权限控制,都依赖于过滤器的配置与应用。在实际开发中,可能需要配置多个过滤器,但每个请求所经过的过滤器组合却因请求不同而异。因此,理解一个请求会通过哪些过滤器,对于熟练使用Shiro至关重要。本文将详细解析请求通过的军魂mkz源码过滤器创建过程。
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创建过程已全面解析完成。如有任何错误或需要进一步讨论的问题,欢迎指正。感谢阅读,期待更多的技术交流。
icmp数据包的过滤主要基于
icmp数据包的过滤主要基于消息源代码。ICMP是“InternetControlMessageProtocol”(因特网控制消息协议)的缩写。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
ICMP协议是一种面向连接的协议,用于传输出错报告控制信息。它是一个非常重要的协议,它对于网络安全具有极其重要的意义。它是TCP/IP协议族的一个子协议,属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。
icmp数据包的重要性
Internet控制信息协议(ICMP)是IP组的一个整合部分。通过IP包传送的ICMP信息主要用于涉及网络操作或错误操作的不可达信息。ICMP包发送是不可靠的,所以主机不能依靠接收ICMP包解决任何网络问题。ICMP协议对于网络安全具有极其重要的意义。ICMP协议本身的特点决定了它非常容易被用于攻击网络上的路由器和主机。
例如,在年8月海信集团测试防火墙的过程中,其防火墙遭受到的ICMP攻击达次之多,占整个攻击总数的%以上!可见,ICMP的重要性绝不可以忽视!
比如,可以利用操作系统规定的ICMP数据包最大尺寸不超过KB这一规定,向主机发起“Ping of Death”(死亡之Ping)攻击。“Ping of Death”攻击的原理是:如果ICMP数据包的尺寸超过KB上限时,主机就会出现内存分配错误,导致TCP/IP堆栈崩溃,致使主机死机。此外,向目标主机长时间、连续、大量地发送ICMP数据包,也会最终使系统瘫痪。
以上内容参考百度百科-因特网控制消息协议
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的请求,实现用户退出,清除认证信息。
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为了兼容未登录的访问,也走了一套认证流程,只不过是一个匿名的身份。
. 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对象中。