Spring MVC: error pages and principal information

spring, spring-mvc, spring-security

Solution

To access principal data from error pages, you need to map your spring security filter as:

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

Problem

I want to implement custom error pages for web application. I use the following way: web.xml ``` <error-page> <error-code>404</error-code> <location>/404/</location> </error-page> ``` spring-security.xml ``` <http use-expressions="true"> <form-login ... /> <access-denied-handler error-page="/403/" /> .... </http> ``` Both pages are handled by appropriate controller. But it seems that the `principal` is unaccesable in this case i.e. I can't get any information about currently logged in user. Is it default behaviour or I have an error in code? Thank you UPD #1: My config: ``` <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/spring-service.xml /WEB-INF/spring-security.xml /WEB-INF/spring-data.xml /WEB-INF/spring-mail.xml </param-value> </context-param> <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-name>hibernateFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> <init-param> <param-name>sessionFactoryBeanName</param-name> <param-value>sessionFactory</param-value> </init-param> </filter> <filter-mapping> <filter-name>hibernateFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> ```

Original source