本人原创,发现一些网站无道德的抓取,请自觉删去内容,转载请注明出处:
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这个我会另写一篇博客进行详细讲解。
相关推荐
2. **IIS中看不到Window Authentication** 在IIS 7.0及更高版本,默认的身份验证选项中不包括“Windows Authentication”。如果需要这个功能,可以通过控制面板的“程序和功能”>“启用或禁用Windows功能”,勾选...
本解答集旨在解决在ASP.NET开发过程中可能遇到的一些常见问题,帮助开发者更好地理解和处理这些问题。 1. **运行时错误处理** ASP.NET提供了详细的错误页面和异常处理机制,如Global.asax中的Application_Error...
代码:<customErrors defaultRedirect="ErrorPage.aspx" mode="RemoteOnly"> 其中元素 defaultRedirect 表示自定义的错误网页的名称。mode 元素表示:对不在本地 Web 服务器上运行的用户显示自定义(友好的)...
6. **错误处理**:`ErrorPage.aspx`用于处理应用程序运行时出现的错误,提供友好的错误信息显示,确保用户体验不受影响。 7. **配置文件**:`web.config`是ASP.NET应用的核心配置文件,包含了应用程序的设置,如...
- 示例:当出现错误时,重定向到"ErrorPage.aspx"。 ```xml <customErrors defaultRedirect="ErrorPage.aspx" mode="RemoteOnly" /> ``` - mode属性可设置为On、Off或RemoteOnly,决定何时显示自定义错误信息。...
总结来说,Spring Security XML配置涉及到的主要知识点包括:`<http>`元素的设置、拦截URL的配置、`<authentication-manager>`和`<authentication-provider>`的使用、自定义登录表单的实现以及Spring MVC和Bootstrap...
<customErrors defaultRedirect="ErrorPage.aspx" mode="RemoteOnly" /> ``` - `defaultRedirect`指定了错误页面的URL,`mode`属性决定在何种环境下显示自定义错误信息。 5. **<httpRuntime> 节** - `...
例如,将所有错误重定向到“ErrorPage.aspx”: ```xml ~/ErrorPage.aspx"/> ``` 5. **httpRuntime**:控制HTTP运行时设置,如请求的最大长度(maxRequestLength)、执行超时时间(executionTimeout)和请求队列限制...
<asp:RequiredFieldValidator ID="valUsername" ControlToValidate="txtUsername" runat="server" ErrorMessage="用户名不能为空"> <asp:TextBox ID="txtPassword" runat="server" TextMode="Password"></asp:...
- **statusCode**: HTTP状态码,如404表示找不到页面。 - **redirect**: 错误页面重定向地址。 ##### 3. Authentication `authentication` 节点用于指定身份验证模式,常见的有: ```xml <authentication mode=...
<customErrors defaultRedirect="ErrorPage.aspx" mode="RemoteOnly"/> ``` 5. `<httpRuntime>`节 配置HTTP运行库参数,如请求大小限制和执行超时时间: ``` ``` 6. `<pages>`节 定义页面特性的配置,如...
-修正了使用IFrameUrl的Tab在切换过程中会重复加载的问题,这是一个在v2.1.6引入的问题(feedback:eroach)。 -修正了启用AutoPostBack的Grid,其RowClick会覆盖LinkButtonField, HyperLinkField, CheckBoxField的...
<security:form-login login-page="/login.html" authentication-failure-url="/login.html?error=true"/> ``` **4.2 修改配置文件** 在 Spring Security 配置文件中,需要明确指出自定义登录页面的位置以及失败后...
<customErrors mode="On" defaultRedirect="ErrorPage.aspx"> <error statusCode="404" redirect="NotFound.aspx" /> ``` 在"绿化.bat"文件中,可能是用于自动化部署的批处理脚本,例如,它可能包含复制文件、...
Spring Security 是一个强大的且高度...总的来说,Spring Security 3.x 提供了一套全面的安全解决方案,涵盖了从认证、授权到会话管理等多个方面。通过理解其核心配置和组件,开发者可以构建出符合业务需求的安全系统。
<add key="ErrorPage" value="Error.aspx" /> ``` 这里展示了如何配置数据库连接字符串和错误页面的路径。 ##### 3. 编译设置(`<compilation>`) `<compilation>` 节点用于指定编译时的一些选项,如默认语言...
14. **错误处理和调试**:学习如何设置和使用Global.asax文件中的Error事件,以及使用Visual Studio进行远程调试,对于解决运行时问题非常有用。 由于具体章节内容未知,以上只是一些可能涵盖的ASP.NET 2.0核心概念...
-不绑定任何数据到Grid时,确保页面不会出错。 -修正了Grid列属性DataFormatString的一个bug,比如设置{0:yy-MM-dd HH:mm}时没有效果。 -修正下拉列表控件不能绑定DataTable的BUG(feedback:RedOcean)。 -增加...
<customErrors mode="On" defaultRedirect="ErrorPage.aspx"> <error statusCode="404" redirect="NotFound.aspx" /> ``` 这里 `mode` 可以设为 `Off`、`RemoteOnly` 或 `On`,分别表示不显示自定义错误页面、仅...
使用Page.Error事件,结合Visual Studio的调试工具,可以有效管理和调试ASP.NET应用。 7. 安全性:理解身份验证、授权和加密解密等安全机制,如Forms Authentication、Role Manager,以及如何防止SQL注入和XSS攻击...