`
zm2011
  • 浏览: 39106 次
社区版块
存档分类
最新评论

根据web提交的过滤器链

阅读更多
spring security从2.0开始,在配置文件中只需配置一个<security:http>命名空间就可以代表一个FilterChainProxy过滤器链,而不用明确的配置出。
org.springframework.security.web.FilterChainProxy维持了一个过滤器链,并用一个currentPosition控制依次执行以下过滤器(spring security3.0.7)。


org.springframework.security.web.session.ConcurrentSessionFilter,
处理session并发。首先判断该访问对应的session是不是第一次访问,如果是第一次访问则SessionInformation为null则过滤链向下进行,如果不是第一次访问则判断此session的标记是不是已过期如果过期则执行推出操作,如果未过期则更行session的访问时间过滤链继续执行。
这个过滤器执行两个方法。首先,它对所有的请求调用org.springframework.security.core.session.SessionRegistry的refreshLastRequest(sessionId)方法,更新已经创建的session的最后请求的时间。然后为每个请求从SessionRegistry重新得到org.springframework.security.core.session.SessionInformation,然后判断这个session是否已经到期。如果已经到期,则会调用org.springframework.security.web.authentication.logout.LogoutFilter销毁这个session,然后重定向一个session无效的URL。这个类主要是判断session是否失效。
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
	
        HttpSession session = request.getSession(false);

        if (session != null) {
            SessionInformation info = sessionRegistry.getSessionInformation(session.getId());

            if (info != null) {
                if (info.isExpired()) {
                    // Expired - abort processing
                    doLogout(request, response);

                    String targetUrl = determineExpiredUrl(request, info);

                    if (targetUrl != null) {
                        redirectStrategy.sendRedirect(request, response, targetUrl);

                        return;
                    } else {
                        response.getWriter().print("This session has been expired (possibly due to multiple concurrent " +
                                "logins being attempted as the same user).");
                        response.flushBuffer();
                    }

                    return;
                } else {
                    // Non-expired - update last request date/time
                    sessionRegistry.refreshLastRequest(info.getSessionId());
                }
            }
        }

        chain.doFilter(request, response);




org.springframework.security.web.context.SecurityContextPersistenceFilter
FILTER_APPLIED属性用于确保此过滤器每次访问只执行一次。此类用于每次过滤器链执行时提供一个SecurityContext放入SecurityContextHolder进行验证。
在请求到来之前从SecurityContextRepository获得SecurityContext存到SecurityContextHolder之中。在请求完毕或清空context holder时再存回SecurityContext仓库。默认是使用一个HttpSessionSecurityContextRepository。这个过滤器在每一次请求只执行一次,解决servlet容器的兼容(特别是Weblogic)。
这个过滤器必须在所有的认证处理机制前执行。因为认证处理机制(BASIC、CAS处理过滤器等)执行时会认为SecurityContextHolder包含一个有效的SecurityContext。
forceEagerSessionCreation属性用于去确定一个session在过滤器链执行前都是可用的。默认是false,因为这是资源密集型的,不推荐

org.springframework.security.web.authentication.logout.LogoutFilter
判断请求rui是不是以j_spring_security_logout结尾,如果是的话就调用logouthandle进行退出操作。一系列的LogoutHandler进行投票,这些投票的顺序应该被规定的。通常需要调用TokenBasedRememberMeServices和SecurityContextLogoutHandler。当退出成功后,根据构造方法调用LogoutSuccessHandler或logoutSuccessUrl进行重定向。

org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
此类继承于org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter这个抽象认证处理过滤器类用于处理基于HTTP浏览器的请求认证。
这个抽象类需要判定请求的uri是不是以j_spring_security_check结尾,如果是的话就进行认证处理,如果不是的话就往下执行。
UsernamePasswordAuthenticationFilter的attemptAuthentication()方法用户认证处理,并且不支持POST提交认证。
将获得的用户名和密码封装为一个org.springframework.security.authentication.UsernamePasswordAuthenticationToken类,此类是Authentication的一个子类,用于将用户名和密码进行简单的封装。然后将用户名存于session中,其key是SPRING_SECURITY_LAST_USERNAME
调用authenticationManager(org.springframework.security.authentication. ProviderManager)中调用配置文件中的认证管理器进行认证。


处理表单提交认证。在spring security3.0是调用AuthenticationProcessingFilter
登录表单必须向此过滤器提供两个参数:用户名和密码。默认的用户名和密码的名字在SPRING_SECURITY_FORM_USERNAME_KEY和SPRING_SECURITY_FORM_PASSWORD_KEY 设定好了。可以通过usernameParameter和passwordParameter修改。
这个过滤器默认对URL(/j_spring_security_check)响应。


org.springframework.security.web.authentication.www.BasicAuthenticationFilter

表单登录此过滤器不执行。

org.springframework.security.web.savedrequest.RequestCacheAwareFilter
在RequestCache查找是否有已存储的和此次访问相同的request如果有则把存储的request传入doFilter方法。

org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter
这个过滤器通过一个被包装的request构成ServletRequest。org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper中根据传入的角色前缀验证request中的Authentication有没有角色访问权限

org.springframework.security.web.authentication.AnonymousAuthenticationFilter
匿名登录过滤器,检查SecurityContextHolder中有没有Authentication,如果没有则创建一个AnonymousAuthenticationToken。
org.springframework.security.web.session.SessionManagementFilter
检查访问开始时此用户是否已被授权,如果已被授权则执行session相关的激活,比如并发登录。

org.springframework.security.web.access.ExceptionTranslationFilter
处理过滤器链中所有的拒绝访问异常和认证异常。这个过滤器是java异常和http 响应之间的一个桥梁,它是唯一和维护用户接口有关的。这个过滤器不执行任何和安全相关的处理。如果一个认证异常被探测到。这个过滤器将加载authenticationEntryPoint,这将处理任何从org.springframework.security.access.intercept.AbstractSecurityInterceptor子类的认证异常。
如果拒绝访问异常被检查到。过滤器将检查这个用户是不是匿名用户。如果是个匿名用户则加载authenticationEntryPoint。如果不是匿名用户,过滤器将转到org.springframework.security.web.access.AccessDeniedHandler默认是加载org.springframework.security.web.access.AccessDeniedHandlerImpl


org.springframework.security.web.access.intercept.FilterSecurityInterceptor

调用org.springframework.security.web.access.intercept.DefaultFilterInvocationSecurityMetadataSource进行验证。这个类并不会执行到验证的行就被返回了。所以这个类实质上并没有进行验证。



分享到:
评论

相关推荐

    JavaWeb中过滤器的三个小案例

    在JavaWeb开发中,过滤器(Filter)是一个非常重要的组件,它可以实现对HTTP请求和响应进行拦截处理。...同时,注意过滤器的配置和顺序也会影响其效果,合理配置过滤链,可以使过滤器发挥更大的作用。

    过滤器文档过滤器使用中的方法过滤器.pdf

    2. **执行过滤**:每当有请求到达时,过滤器链会按注册的顺序依次调用每个过滤器的`doFilter()`方法。在这个方法中,我们可以决定是否允许请求继续到下一个过滤器或Servlet。 3. **销毁**:服务器关闭时,每个过滤器...

    过滤器进行登录操作

    1. **过滤器链**:多个过滤器可以组成一个过滤器链,每个过滤器按照在web.xml中的声明顺序依次执行。我们可以设置多个过滤器来处理不同的登录需求,比如身份验证、权限检查等。 2. **身份验证**:在用户尝试访问受...

    过滤器笔记整理

    - **概念**:当多个过滤器被配置时,它们会按顺序组成一个过滤器链。每个请求都会依次经过这些过滤器的处理。 - **执行顺序**:容器根据`web.xml`中的配置顺序依次调用各个过滤器的`doFilter()`方法。每个过滤器的...

    包含过滤器的一个简单登陆实例

    3. **过滤器链**:多个过滤器可以串联起来形成过滤器链,每个过滤器按照声明的顺序依次执行。如果前一个过滤器未阻止请求,请求会传递给下一个过滤器。 4. **登录逻辑**:在我们的例子中,`doFilter`方法内会检查...

    过滤器实验

    2. 如果存在过滤器链(Filter Chain),则将修改后的请求传递给下一个过滤器,直到到达最后一个过滤器。 3. 最后,过滤器将请求转发给实际的目标资源,如Servlet。同样,响应也会按照过滤器链的逆序返回,每个过滤器...

    struts2.0字符编码使用过滤器

    在响应返回给客户端之前,过滤器链会逆序执行,再次有机会处理响应。 7. **i18n国际化** 文件名"i18n"可能指的是国际化(Internationalization)支持,这是Web应用处理多语言环境的关键。在Struts2中,可以使用...

    zendframework2过滤器封装

    2. **过滤器链**:在ZF2中,你可以创建一个过滤器链,将多个过滤器串联起来,数据会依次通过每个过滤器进行处理。这可以通过`Zend\Filter\FilterChain`类实现,你可以添加多个过滤器到链中,并设置执行顺序。 3. **...

    spring+security+11种过滤器介绍.doc

    1. HttpSessionContextIntegrationFilter:这是Spring Security过滤器链的第一个过滤器。它的主要职责是确保每个线程都有一个SecurityContext实例,这个实例存储了当前用户的认证信息。当请求到达时,它检查session...

    ssh框架乱码过滤器Filter

    在Struts2的配置文件(struts.xml)中,我们可以添加一个全局拦截器链(interceptors)或过滤器链(filters)。以下是一个配置示例: ```xml &lt;filter-name&gt;charsetFilter &lt;filter-class&gt;...

    留言本程序中的过滤器

    以下是根据标题和描述详细解释的四个过滤器及其相关知识点: 1. **中文编码过滤器**: 在处理中文字符时,不同的编码格式可能导致乱码问题。中文编码过滤器的主要任务是确保用户输入的中文字符能正确地被系统识别...

    六个有用的java过滤器

    在Java Web开发中,过滤器(Filter)是一种非常重要的技术,它能够对用户的请求和响应进行预处理或后处理,从而实现各种功能需求,例如设置缓存策略、登录验证、字符编码转换等。下面我们将详细探讨标题和描述中提到...

    SSM登陆验证之过滤器实现

    SSM(Spring、SpringMVC、MyBatis)框架是Java Web开发中常见的技术栈,其在处理用户请求时,通常会用到过滤器(Filter)进行预处理,以实现如登录验证等功能。本篇文章将深入讲解如何在SSM项目中通过过滤器实现登录...

    java过滤器

    一个Web应用可以有多个过滤器,它们会按照在web.xml中的配置顺序形成一个过滤链。每个请求会依次经过这些过滤器,直到到达目标Servlet。过滤器之间可以共享信息,例如,一个登录验证过滤器可以在会话中设置一个标志...

    使用过滤器解决中文乱码问题

    接下来需要在`web.xml`文件中配置这个过滤器,使其能够在所有请求中生效: ```xml &lt;filter-name&gt;characterEncoding &lt;filter-class&gt;com.v512.example.CharacterEncodingFilter&lt;/filter-class&gt; &lt;filter-name&gt;...

    在使用实现过滤器进行request包装,获取内层request的分析

    在Java Web开发中,过滤器(Filter)是一个非常重要的组件,它允许我们在请求到达目标Servlet之前对其进行处理,或者在响应返回给客户端之后进行操作。在本篇内容中,我们将深入探讨如何实现一个过滤器来包装request...

    用过滤器验证登陆框架,简单实例

    6. **过滤器链**:在Web应用中可能存在多个过滤器,它们按照在web.xml中定义的顺序形成一个过滤器链。每个过滤器都可以选择是否继续传递请求给下一个过滤器。 此外,标签“源码”和“工具”暗示可能有相关的代码...

    版本控制与过滤器设计

    4. **过滤器模型**:在给定的压缩包文件"FilterModel"中,可能包含了实现过滤器模式的代码示例或框架,如定义过滤器接口、过滤器链的组织方式等。 在实际应用中,版本控制和过滤器设计常常结合使用。例如,开发者...

    bboss 安全认证过滤器功能介绍

    2. **过滤链执行**:`doFilter()`方法是过滤器的核心,它会在每次请求经过时被调用。在`SYSAuthenticateFilter`中,这个方法会检查当前请求的用户是否已经登录,如果未登录,则重定向到登录页面;如果已登录,但用户...

    基于Java过滤器实现的系统权限控制方法研究.pdf

    使用过滤器技术,将敏感词以配置文件形式作为过滤器参数,在用户提交数据时进行检测,发现问题内容及时丢弃,可以从源头上避免敏感词等脏数据进入系统。 * 系统权限控制:Web 应用用户角色复杂,页面非常多,在每个...

Global site tag (gtag.js) - Google Analytics