I have problems in using custom error messages on my login.jsp page. I want to capture two scenarios: 1) failed login (login_error = 1), and 2) expired http session (login_error=2). I have developed a custom filter for session expiration handling based on a suggestion provided by another thread in the forum. It seems to work, but the problem is once I get redirected to the 'login.jsp?login_error=2' page, subsequent login attempts from the same browser window fails with the "session expired" message. Here is my login.jsp page snippet:
I am using a custom SessionFilter for handling the HTTP session. Here is the Java cpde for custom sesssion filter.Code:<c:if test="${(not empty param.login_error) && param.login_error==1}"> <span id="errmsg" class="errormesage">Authentication failed. Please try again.</span> </c:if> <c:if test="${(not empty param.login_error) && param.login_error==2}"> <span id="errmsg" class="errormesage">Session expired. Please login again. </c:if>
Here is my applixationContext-security.xml file:Code:import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.util.Assert; public class SessionFilter implements Filter, InitializingBean { private FilterConfig filterConfig; protected final Log logger = LogFactory.getLog(getClass()); private String expiredUrl; public void destroy() { } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { logger.info("Session filter called..."); if(req instanceof HttpServletRequest){ HttpServletRequest hReq = (HttpServletRequest)req; HttpServletResponse hRes = (HttpServletResponse)res; HttpSession session = hReq.getSession(false); logger.info("--> HttpSession: "+session); if(session == null && hReq.getRequestedSessionId() != null && !hReq.isRequestedSessionIdValid()){ logger.info("Session Id: "+hReq.getRequestedSessionId()); logger.info("Valid Session: "+hReq.isRequestedSessionIdValid()); String targetUrl = hReq.getContextPath() + expiredUrl; logger.info("Session expired........... Redirecting to login page."); hRes.sendRedirect(hRes.encodeRedirectURL(targetUrl)); return; } chain.doFilter(req,res); } } public void init(FilterConfig config) throws ServletException { } public void afterPropertiesSet() throws Exception { logger.info("Entry: afterPropertiesSet"); Assert.hasText(expiredUrl, "ExpiredUrl Required"); logger.info("Exit: afterPropertiesSet"); } public void setExpiredUrl(String expiredUrl) { this.expiredUrl = expiredUrl; } }
My web.xml file specifies thw filter as follows:Code:<http> <intercept-url pattern="/login.jsp" filters="none"/> <intercept-url pattern="/*.html" access="ROLE_USER" /> <form-login login-page='/login.jsp' login-processing-url="/j_spring_security_check" default-target-url='/dashboard.html' always-use-default-target='true' authentication-failure-url="/login.jsp?login_error=1"/> <concurrent-session-control max-sessions="1" exception-if-maximum-exceeded="true" expired-url="/login.jsp?login_error=2"/> </http> <authentication-provider> <user-service> <user name="testuser" password="testing123" authorities="ROLE_USER" /> </user-service> </authentication-provider> <beans:bean id="filterChainProxy" class="org.springframework.security.util.FilterChainProxy"> <filter-chain-map path-type="ant"> <filter-chain pattern="/login.jsp" filters="none"/> <filter-chain pattern="/**" filters="sessionExpirationFilter"/> </filter-chain-map> </beans:bean> <beans:bean id="sessionExpirationFilter" class="myapp.web.SessionFilter"> <custom-filter position="FIRST"/> <beans:property name="expiredUrl" value="/login.jsp?login_error=2"/> </beans:bean> <beans:bean id="authenticationProcessingFilter" class="org.springframework.security.ui.webapp.AuthenticationProcessingFilter"> <beans:property name="defaultTargetUrl" value="/login.jsp?login_error=1"/> <beans:property name="authenticationManager" ref="authenticationManager" /> </beans:bean> <authentication-manager alias="authenticationManager" />
Any help is greatly appreciated.Code:<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>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> </filter-mapping>


