Re: Spring Security + AJAX Session Timeout issue

Lachezar Dobrev <[email protected]> Wed, 28 May 2014 18:58:12 +0300
Newsgroups gmane.comp.java.springframework.user
Message-ID <CA+xsaB0MMJjDjyOFAuN-sJGThT5fhoKww21LXMx+7_0jOX6iLw@mail.gmail.com>
  To work around this kind of problems I have added an instance of the
Remember-Me infrastructure that adds cookies with a session-only life.
That allows requests to be re-authenticated and re-authorised even if
the session has timed out.

2014-05-28 15:00 GMT+03:00 Alessandro Ferrucci <[email protected]>:
> Hello,
> I have a Spring MVC application which loads data dynamically through AJAX.
> All AJAX entry points are protected and the user must be authenticated in
> order to access the AJAX endpoints.
>
> I need for my front end code to know when a session timeout occurs when an
> AJAX request is made.  I have implemented this using
> LoginAuthenticationEntryPoint implementation and if the HTTP request
> contains the "X-Requested-With header" with a value of "XMLHttpRequest", I
> send back a 403 Error Code.
>
> This works for the most part, the issue is that on the very first AJAX
> Request, spring performs a redirect and I get a 302 followed by a redirect
> to my login page, on all subsequent AJAX requests the correct 403 comes
> back.
>
> Below is the relevant Spring security config and the
> AjaxAwareAuthenticationEntryPoint source.
>
> Side Note: I have also tried this using the request matcher implementation
> outlined here:
> http://distigme.wordpress.com/2012/11/01/ajax-and-spring-security-form-based-login/
> and I get the same exact results.
>
> Any ideas?
>
> Thanks!
> Alessandro Ferrucci
>
> <beans:bean id="authenticationEntryPoint"
> class="mojo.ocs.web.AjaxAwareAuthenticationEntryPoint">
>         <beans:constructor-arg name="loginUrl" value="/login"/>
>     </beans:bean>
>     <!-- ENTRY POINT REF IMPLEMENTATION -->
>     <http auto-config="true" use-expressions="true"
> access-denied-page="/accessdenied"
> entry-point-ref="authenticationEntryPoint">
>         <intercept-url pattern="/login" access="isAnonymous()"/>
>         <intercept-url pattern="/loginfailed" access="isAnonymous()"/>
>         <intercept-url pattern="/welcome" access="isAuthenticated()" />
>         <intercept-url pattern="/" access="isAuthenticated()" />
>         <intercept-url pattern="/private_res/**" access="isAuthenticated()"
> />
>         <intercept-url pattern="/tne/**" access="isAuthenticated()" />
>         <intercept-url pattern="/team_reports/**" access="isAuthenticated()"
> />
>         <form-login login-page="/login" default-target-url="/welcome"
> always-use-default-target="true" authentication-failure-url="/loginfailed"
> />
>         <logout delete-cookies="JSESSIONID"  logout-success-url="/logout"
> invalidate-session="true"/>
>         <session-management invalid-session-url="/login" />
>     </http>
>
> This is the AjaxAwareAuthenticationEntryPoint:
>
> public class AjaxAwareAuthenticationEntryPoint extends
> LoginUrlAuthenticationEntryPoint {
>
>     public AjaxAwareAuthenticationEntryPoint(String loginUrl) {
>         super(loginUrl);
>     }
>
>     @Override
>     public void commence(
>             HttpServletRequest request,
>             HttpServletResponse response,
>             AuthenticationException authException)
>             throws IOException, ServletException {
>         String ajaxHeader = ((HttpServletRequest)
> request).getHeader("X-Requested-With");
>         boolean isAjax = "XMLHttpRequest".equals(ajaxHeader);
>         if (isAjax) {
>             response.sendError(HttpServletResponse.SC_FORBIDDEN, "Ajax
> REquest Denied (Session Expired)");
>         } else {
>             super.commence(request, response, authException);
>         }
>     }
> }
>
> ------------------------------------------------------------------------------
> Time is money. Stop wasting it! Get your web API in 5 minutes.
> www.restlet.com/download
> http://p.sf.net/sfu/restlet
> _______________________________________________
> Springframework-user mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/springframework-user
>

------------------------------------------------------------------------------
Time is money. Stop wasting it! Get your web API in 5 minutes.
www.restlet.com/download
http://p.sf.net/sfu/restlet