Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring security Spring安全性:注销后重定向到上一个url_Spring Security - Fatal编程技术网

Spring security Spring安全性:注销后重定向到上一个url

Spring security Spring安全性:注销后重定向到上一个url,spring-security,Spring Security,我有一个使用spring security的web应用程序。我想将用户重定向回他们注销时注销前所在的页面 有没有简单的方法可以做到这一点?只是一个想法: 我们保存一堆访问过的页面怎么样。最多可以有3个条目。并重定向用户退出 配置筛选器或扩展spring安全筛选器,以在会话中维护关于最后两个访问URL的堆栈 注销时,将servlet配置为注销成功url 现在从会话堆栈获取URL,现在使会话无效并将用户重定向到该页面 您还可以利用Vijay提到的在spring security的过滤器链中添加一

我有一个使用spring security的web应用程序。我想将用户重定向回他们注销时注销前所在的页面

有没有简单的方法可以做到这一点?

只是一个想法:

我们保存一堆访问过的页面怎么样。最多可以有3个条目。并重定向用户退出

  • 配置筛选器或扩展spring安全筛选器,以在会话中维护关于最后两个访问URL的堆栈

  • 注销时,将servlet配置为
    注销成功url

  • 现在从会话堆栈获取URL,现在使会话无效并将用户重定向到该页面


您还可以利用Vijay提到的

在spring security的过滤器链中添加一个新的过滤器。该新筛选器将应用于
/logout
URL。使用此过滤器时,可以将当前页面保存在字段变量中。当通过过滤器返回时。您可以将请求重定向到保存的URL。我想这会有帮助。您可以通过使用
请求
对象中的
Referer
标题获取当前页面URL。

不确定此问题所指的是哪个Spring版本-但是标准
org.springframework.security.web.authentication.logout.SimpleRullogoutsAccessHandler
上有一个
useReferer
属性Spring3.0

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

<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>

您需要的是一个简单的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)

这会将您重定向到referer URL。

您确定也要这样做吗?如果用户正在访问某个安全页面,您是否希望允许他在注销后访问该安全页面。主要是我希望他们被发送回登录屏幕。一旦他们成功登录,登录页面会将他们发送到最初请求的页面,我希望他们从那里注销。我使用了这个,它工作正常。但是,当我从安全页面注销时,它会转到登录表单。。。在这种情况下,有没有办法转到不同的URL?(即主页)我认为标准的SimpleRullogoutSuccessHandler不可能做到这一点。您可以扩展它并覆盖
determinateTargetURL(HttpServletRequest,HttpServletResponse)
方法来实现自定义行为。但是您需要知道被重定向到的Url(由
super.determinateTargetURL(请求、响应);
确定)是否受保护。。除了检查targetUrl字符串,我没有找到其他方法。