`

解决errorpage里面取不到Authentication的问题

    博客分类:
  • java
阅读更多

            本人原创,发现一些网站无道德的抓取,请自觉删去内容,转载请注明出处:

       http://asialee.iteye.com/blog/1772860

      项目中遇到一个很奇怪的问题,在错误页面404里面取不到当前登录用户,即 SecurityContextHolder.getContext().getAuthentication()取不到当前的登陆用户信息。这个问题花了我很长时间最终搞定了,下面讲一下解决问题的过程。

          首先来看一下项目的异常处理方式,在web.xml里面配置了错误页:

          

<error-page>
		<error-code>404</error-code>
		<location>/WEB-INF/pages/errors/404.jsp</location>
	</error-page>

           当访问一个不存在的url时,spring的前端控制器的逻辑如下:



        其实就是会调用noHandlerFound函数,然后直接退出DispatcherServlet。

        我们再来一下noHandlerFound的逻辑:



         在这个里面实际上是返回一个404的错误,真正的错误页面处理的转向是由tomcat容器来完成的。通过调试发现在这个地方SecurityContextHolder.getContext().getAuthentication()还有值,但是访问404页面的tag里面就取不到了,后来通过监控网络发现,访问errorpage是由容器重新发起的一个请求,这个请求里面拿不到Authentication可能是没有走springsecurity的前端拦截器 springSecurityFilterChain。

         我们来看一下springSecurityFilterChain filter的配置:

<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

 

         突然想到极有可能是这个filter没有转发,后来看了下filter-mapping的配置,还真是这样。filter-mapping里面接受dispatcher参数。

         我们就来看一下这个参数的含义。

 

          2.4版本的servlet规范在部属描述符中新增加了一个<dispatcher>元素,这个元素有四个可能的值:即REQUEST,FORWARD,INCLUDE和ERROR,可以在一个<filter-mapping>元素中加入任意数目的<dispatcher>,使得filter将会作用于直接从客户端过来的request,通过forward过来的request,通过include过来的request和通过<error-page>过来的request。如果没有指定任何< dispatcher >元素,默认值是REQUEST。

            可以通过下面几个例子来辅助理解。 

<filter-mapping> 
<filter-name>Logging Filter</filter-name> 
<url-pattern>/products/*</url-pattern> 
</filter-mapping>

           这种情况下,过滤器将会作用于直接从客户端发过来的以/products/…开始的请求。因为这里没有制定任何的< dispatcher >元素,默认值是REQUEST

<filter-mapping> 
<filter-name>Logging Filter</filter-name> 
<servlet-name>ProductServlet</servlet-name> 
<dispatcher>INCLUDE</dispatcher> 
</filter-mapping> 

        这种情况下,如果请求是通过request dispatcher的include方法传递过来的对ProductServlet的请求,则要经过这个过滤器的过滤。其它的诸如从客户端直接过来的对ProductServlet的请求等都不需要经过这个过滤器。 

        指定filter的匹配方式有两种方法:直接指定url-pattern和指定servlet,后者相当于把指定的servlet对应的url-pattern作为filter的匹配模式 
filter的路径匹配和servlet是一样的,都遵循servlet规范中《SRV.11.2 Specification of Mappings》一节的说明 

 

<filter-mapping> 
<filter-name>Logging Filter</filter-name> 
<url-pattern>/products/*</url-pattern> 
<dispatcher>FORWARD</dispatcher> 
<dispatcher>REQUEST</dispatcher> 
</filter-mapping> 

         看了这个,我修改了下springSecurityFilterChain的filter-mapping的配置,就     好了。

          修改后的配置如下:

<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>ERROR</dispatcher>
	</filter-mapping>

         意思就是直接从客户端过来的request和通过<error-page>过来的request 都要走这个filter,配置完后就果断好了

         好了,就写到这里了,希望对大家有所帮助。关于springSecurityFilterChain这个我会另写一篇博客进行详细讲解。

 

  • 大小: 27.3 KB
  • 大小: 36.6 KB
分享到:
评论

相关推荐

    IIS-7.5版本中一些诡异问题的解决方案

    2. **IIS中看不到Window Authentication** 在IIS 7.0及更高版本,默认的身份验证选项中不包括“Windows Authentication”。如果需要这个功能,可以通过控制面板的“程序和功能”&gt;“启用或禁用Windows功能”,勾选...

    asp.net常见问题解答

    本解答集旨在解决在ASP.NET开发过程中可能遇到的一些常见问题,帮助开发者更好地理解和处理这些问题。 1. **运行时错误处理** ASP.NET提供了详细的错误页面和异常处理机制,如Global.asax中的Application_Error...

    ASP.NET配置文件Web.config详解

    代码:&lt;customErrors defaultRedirect="ErrorPage.aspx" mode="RemoteOnly"&gt; 其中元素 defaultRedirect 表示自定义的错误网页的名称。mode 元素表示:对不在本地 Web 服务器上运行的用户显示自定义(友好的)...

    asp.net 网盘源码

    6. **错误处理**:`ErrorPage.aspx`用于处理应用程序运行时出现的错误,提供友好的错误信息显示,确保用户体验不受影响。 7. **配置文件**:`web.config`是ASP.NET应用的核心配置文件,包含了应用程序的设置,如...

    C#Web.config文件详解

    - 示例:当出现错误时,重定向到"ErrorPage.aspx"。 ```xml &lt;customErrors defaultRedirect="ErrorPage.aspx" mode="RemoteOnly" /&gt; ``` - mode属性可设置为On、Off或RemoteOnly,决定何时显示自定义错误信息。...

    spring security xml方式配置

    总结来说,Spring Security XML配置涉及到的主要知识点包括:`&lt;http&gt;`元素的设置、拦截URL的配置、`&lt;authentication-manager&gt;`和`&lt;authentication-provider&gt;`的使用、自定义登录表单的实现以及Spring MVC和Bootstrap...

    ASP.NET配置文件Web.config 详细解释

    &lt;customErrors defaultRedirect="ErrorPage.aspx" mode="RemoteOnly" /&gt; ``` - `defaultRedirect`指定了错误页面的URL,`mode`属性决定在何种环境下显示自定义错误信息。 5. **&lt;httpRuntime&gt; 节** - `...

    认识ASP.NET配置文件

    例如,将所有错误重定向到“ErrorPage.aspx”: ```xml ~/ErrorPage.aspx"/&gt; ``` 5. **httpRuntime**:控制HTTP运行时设置,如请求的最大长度(maxRequestLength)、执行超时时间(executionTimeout)和请求队列限制...

    Forms 验证与授权简单事例

    &lt;asp:RequiredFieldValidator ID="valUsername" ControlToValidate="txtUsername" runat="server" ErrorMessage="用户名不能为空"&gt; &lt;asp:TextBox ID="txtPassword" runat="server" TextMode="Password"&gt;&lt;/asp:...

    .Net中Web.config详解

    - **statusCode**: HTTP状态码,如404表示找不到页面。 - **redirect**: 错误页面重定向地址。 ##### 3. Authentication `authentication` 节点用于指定身份验证模式,常见的有: ```xml &lt;authentication mode=...

    认识ASP.NET配置文件Web.config

    &lt;customErrors defaultRedirect="ErrorPage.aspx" mode="RemoteOnly"/&gt; ``` 5. `&lt;httpRuntime&gt;`节 配置HTTP运行库参数,如请求大小限制和执行超时时间: ``` ``` 6. `&lt;pages&gt;`节 定义页面特性的配置,如...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -修正了使用IFrameUrl的Tab在切换过程中会重复加载的问题,这是一个在v2.1.6引入的问题(feedback:eroach)。 -修正了启用AutoPostBack的Grid,其RowClick会覆盖LinkButtonField, HyperLinkField, CheckBoxField的...

    spring security 安全权限管理手册

    &lt;security:form-login login-page="/login.html" authentication-failure-url="/login.html?error=true"/&gt; ``` **4.2 修改配置文件** 在 Spring Security 配置文件中,需要明确指出自定义登录页面的位置以及失败后...

    Demo10_webconfig配置.rar

    &lt;customErrors mode="On" defaultRedirect="ErrorPage.aspx"&gt; &lt;error statusCode="404" redirect="NotFound.aspx" /&gt; ``` 在"绿化.bat"文件中,可能是用于自动化部署的批处理脚本,例如,它可能包含复制文件、...

    spring-security3入门教程.doc

    Spring Security 是一个强大的且高度...总的来说,Spring Security 3.x 提供了一套全面的安全解决方案,涵盖了从认证、授权到会话管理等多个方面。通过理解其核心配置和组件,开发者可以构建出符合业务需求的安全系统。

    Web.config配置详解

    &lt;add key="ErrorPage" value="Error.aspx" /&gt; ``` 这里展示了如何配置数据库连接字符串和错误页面的路径。 ##### 3. 编译设置(`&lt;compilation&gt;`) `&lt;compilation&gt;` 节点用于指定编译时的一些选项,如默认语言...

    ASP.NET 2.0全程指南第7章

    14. **错误处理和调试**:学习如何设置和使用Global.asax文件中的Error事件,以及使用Visual Studio进行远程调试,对于解决运行时问题非常有用。 由于具体章节内容未知,以上只是一些可能涵盖的ASP.NET 2.0核心概念...

    ExtAspNet_v2.3.2_dll

    -不绑定任何数据到Grid时,确保页面不会出错。 -修正了Grid列属性DataFormatString的一个bug,比如设置{0:yy-MM-dd HH:mm}时没有效果。 -修正下拉列表控件不能绑定DataTable的BUG(feedback:RedOcean)。 -增加...

    对web.config的一些解析

    &lt;customErrors mode="On" defaultRedirect="ErrorPage.aspx"&gt; &lt;error statusCode="404" redirect="NotFound.aspx" /&gt; ``` 这里 `mode` 可以设为 `Off`、`RemoteOnly` 或 `On`,分别表示不显示自定义错误页面、仅...

    ASP.NET秘技集锦

    使用Page.Error事件,结合Visual Studio的调试工具,可以有效管理和调试ASP.NET应用。 7. 安全性:理解身份验证、授权和加密解密等安全机制,如Forms Authentication、Role Manager,以及如何防止SQL注入和XSS攻击...

Global site tag (gtag.js) - Google Analytics