2011-05-25 75 views
5

我已经得到了使用弹簧安全的web应用程序之后。我想在用户退出登录前将用户重定向到他们所在的页面。春季安全:重定向到URL以前注销

是否有一个简单的方法来做到这一点?

+0

你肯定也想这样?用户访问某个安全页面时,是否希望在注销后允许他在该安全页面上访问? – 2011-05-25 06:15:41

+0

@Vijay可能是因为来宾 – 2011-05-25 06:17:34

+1

主要是我想他们被送回登录屏幕。登录页面将它们发送到最初请求的页面,一旦它们已经成功登录,我希望这是他们注销的地方。 – 2011-05-27 04:04:33

回答

1

您可以添加弹簧安全滤波器链中的新滤波器。该新文件将应用于/logout网址。通过此过滤器时,您可以将当前页面保存在字段变量中。当通过过滤器返回时。您可以将请求重定向到保存的URL。我认为这可以提供帮助。您可以通过使用获取当前页面的URL。 Referer标题在Request对象中。

0

只是一个想法:

我们如何保持一堆访问过的页面。可能最多3个条目。并从注销重定向用户。

  • 配置过滤器或扩展春季安全过滤器,以保持会话的堆栈约最后两个访问的网址

  • 在注销配置servlet作为logout-success-url

  • 现在得到会话栈的URL和现在无效会话并重定向用户到该页面

您也可以利用referrer header作为维杰提到

7

不确定这个问题是指哪个Spring版本 - 但自Spring 3.0以来,标准org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler上有一个useReferer属性。

因此,所有你需要做的就是配置它这样和注销将重定向到任何地方的用户来自何处:

<bean id="logoutSuccessHandler" class="org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler"> 
    <property name="useReferer" value="true"/> 
</bean> 

<security:http> 
    <security:logout logout-url="/logout" success-handler-ref="logoutSuccessHandler" /> 
</security:http> 
+0

我用这个,它工作正常。但是,当我从受保护的页面注销它去登录表单...在这种情况下有什么办法去不同的URL? (即主页) – Mat 2012-07-12 12:53:58

+0

我不认为这是可能的标准SimpleUrlLogoutSuccessHandler。您可以扩展它并覆盖'determineTargetUrl(HttpServletRequest请求,HttpServletResponse响应)'方法来实现自定义行为。但是你需要知道,如果网址(由'super.determineTargetUrl(请求,响应)来确定;')这是被重定向到被保护。我没有找到一个方法来做到这一点不是检查targetUrl这个字符串其他那里。 – meyertee 2012-07-14 09:04:37

0

你需要的是一个简单的LogoutSuccessHandler

@Component 
    public class CustomLogoutSuccessHandler extends 
    SimpleUrlLogoutSuccessHandler implements LogoutSuccessHandler { 

@Override 
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse 
    response, Authentication authentication) 
     throws IOException, ServletException { 
    if (authentication != null) { 
     System.out.println(authentication.getName()); 
    } 
    response.setStatus(HttpStatus.OK.value()); 
    response.sendRedirect(request.getHeader("referer")); 
} 

后来在您的配置方法中调用它,例如

.logout().logoutSuccessHandler(customLogoutSuccessHandler) 

这会将您重定向到引用URL。