You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Kim Ming Yap <ya...@hotmail.com> on 2015/05/18 00:46:44 UTC

Tomcat valve JAAS : form error page displayed first before response reaches back to Tomcat valve‏



Hi,I'm building a website using form based authentication integrating with JAAS for user based authentication. I don't have issue when a successful credential is authenticated. Rather I'm having difficulty understanding the flow of JAAS back to the client should the form based authentication failed.SOFTWARE:1. Apache Tomee plus 1.7.12. Java 83. Tomcat JAAS RealmOBJECTIVE:Custom error captured in JAAS login module to propagate to error pageBASIC UNDERSTANDING:The Tomcat JAAS layer is not integrated with the web container layer. Hence the former does not have access to request, session etc.SOLUTION:Using ThreadLocal which capture the custom error message in JAAS layer to be used when the flow reaches back to the custom valve on the way back to the browser.PROBELM:Understanding of basic request/response flow involving Tomcat and JAASa. request --> valve --> JAAS --> Filter --> Servlet/JSP    b. response <-- valve (**) <-- JAAS <-- Filter <-- Servlet/JSP(refer to above clause b)ThreadLocal in the JAAS layer managed to capture the custom error message and it i managed to print it after the getNext() method of the custom valve. Thought of adding this custom error as an attribute in the session object.However I noticed that the error page is already displayed before i could add this cusom error (immediately after the getNext method).Due to that the ready custom error message cannot be usedSAMPLE CODES:1. web.xml    <login-config>    <auth-method>FORM</auth-method>    <form-login-config>      <form-login-page>/login.jsp</form-login-page>      <form-error-page>/login-redirect-error.jsp?error=true</form-error-page>    </form-login-config>    </login-config>    2. Custom valve and defined in META-INF/context.xml    public class SecurityValve extends ValveBase {	public void invoke(Request request, Response response) throws IOException, ServletException {		getNext().invoke(request, response);           system.out.println("after getNext()"); --> break point (BP)	}    }1. Did a break point on SecurityValve (indicated at BP)     2. On forms, i purposely enter wrong credential and submit         3. Break point stops at BP     4. login-redirect-error.jsp displayed already    5. Since it stop at break point BP in SecurityValve, the response back to client flow has not reached the browser. Yet the login-redirect-error.jsp is already displayedQUESTIONS:   How can the login-redirect-error.jsp be displayed on the browser when the response flowing back to client stop at break point BP? The flow back to the client is not fully done yet.I would really appreciate any help.Thanks.