2017-07-24 90 views
0

我有一个基于Spring-Security的grails-app,当会话超时时,我想重定向到开始页面。Grails,在AJAX调用中处理会话超时

这似乎很难解决,所以至少我想要一个解决方案,当你点击一个连接到Ajax函数的链接时重定向到开始页面。 因为当你点击链接时很烦人,并且因为你的会话超时而没有任何反应。 希望有人能告诉我一个简单的解决方案或至少一个解决方案。

+0

我想如果你的ajax在sesson过期后调用了一个控制器动作,它有一个安全标注spring-security-core插件会自动将用户重定向到登录页面。 如果你使用的是spring-security-rest插件,那么你可以检查401(未授权)r esponse状态并重定向到登录页面。 –

回答

0

一种选择是通过头“的nopage”值为“真”与您的Ajax调用和春季安全插件的AjaxAwareAuthenticationEntryPoint将返回HTTP状态代码401

另一种方法是创建一个自定义的身份验证入口点。并在commence检查它是否是ajax请求,只是返回SC_UNAUTHORIZED响应代码。在你的javascript检查中,如果状态码是SC_UNAUTHORIZED 401,那么就适当地处理它。

class CustomAuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint { 

    public CustomAuthenticationEntryPoint(String loginFormUrl) { 
     super(loginFormUrl) 
    } 

    @Override 
    void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, javax.servlet.ServletException { 
     if (SpringSecurityUtils.isAjax(request)) { 
      response.sendError(HttpServletResponse.SC_UNAUTHORIZED) 
      return 
     } 
     super.commence(request, response, authException) 
    } 

} 

(见SpringSecurityCoreGrailsPlugin与名称的AuthenticationEntryPoint找到豆,你需要重写该bean。

如果您正在使用jQuery我想你可以使用全局ajaxError callback注册bean作为Spring Bean与名authenticationEntryPoint