gpt4 book ai didi

spring-security - 如何在spring security中传递参数和注销成功url?

转载 作者:行者123 更新时间:2023-12-01 04:57:35 27 4
gpt4 key购买 nike

我在我的 spring 启动应用程序中使用基于 java 的 spring 安全配置。当用户单击注销链接时,用户将被重定向到登录页面。在这里,在这种情况下,我需要在注销成功 url 中传递一个自定义参数。

例如当我注销时,应用程序被重定向到 http://localhost:8080/app/login
但我希望它有一个像下面这样的参数
http://localhost:8080/app/login?idletimeout=true

我为此创建了我的自定义 LogoutSuccesshandle。我在处理程序中获取 param 值,然后构建成功 url,然后重定向到它。但是在注销时该参数丢失了。

下面是我的处理程序代码。

public class LogoutSuccessHandlerImpl extends SimpleUrlLogoutSuccessHandler {

private final RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();

@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {

request.getSession().invalidate();
SecurityContextHolder.clearContext();

request.setAttribute("isLoggedOut", "true");

String contextPath = request.getContextPath();
String redirectURL = "/login";

String isIdleTimeOut = request.getParameter("idleTimeout");
request.setAttribute("idleTimeout", isIdleTimeOut);

System.out.println(isIdleTimeOut + " isIdleTimeOut ");

if (isIdleTimeOut != null && isIdleTimeOut.equalsIgnoreCase("true")) {
System.out.println("in if ");
redirectURL += "?idleTimeout=" + isIdleTimeOut;
}

// setDefaultTargetUrl(redirectURL);
// response.sendRedirect(redirectURL);
// super.onLogoutSuccess(request, response, authentication);
redirectStrategy.sendRedirect(request, response, redirectURL);
}

下面是我的java配置代码。
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf()
.and()
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/checkLogin")
.defaultSuccessUrl("/home")
.failureUrl("/login?login_error=1")
.usernameParameter("username")
.passwordParameter("password")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessHandler(new LogoutSuccessHandlerImpl())
.deleteCookies("JSESSIONID")
.invalidateHttpSession(true)
.permitAll()
.and()
.authorizeRequests()
.antMatchers("/login**").permitAll()
.antMatchers("/error**").permitAll()
.antMatchers("/checkLogin**").permitAll()
.anyRequest()
.authenticated()
.accessDecisionManager(accessDecisionManager)
.and()
.exceptionHandling()
.accessDeniedPage("/accessDenied")
.and()
.headers()
.frameOptions()
.disable()
.and()
.sessionManagement()
.invalidSessionUrl("/login")
.maximumSessions(1);
}

最佳答案

您可以做的是为您的应用程序准备自己的注销方法(自定义注销 URL):

1) 准备您的 LogoutController:

@Controller
@RequestMapping(value = "/logout")
public class LogoutController {

@RequestMapping(value = {"", "/"})
public String logout(HttpServletRequest request) {
SecurityContextHolder.clearContext();
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}
return "redirect:" + <your-logout-success-url>;
}

}

在这里,使 session 无效并清除上下文为您提供了一种注销机制。

2) 在 jsp 文件中更新您的注销网址:
<a href="/logout" id="logout_" title="Log out"><span>Log out</span></a>

3)另外,对于默认的“注销”场景,仍然可以继续使用Spring Security注销:
<logout logout-success-url="/" invalidate-session="true" delete-cookies="JSESSIONID"
logout-url="/j_spring_security_logout"/>

因此,在此注销方法中,当用户要求注销过程时,您可以对请求对象执行任何操作。您现在不需要传递参数。

关于spring-security - 如何在spring security中传递参数和注销成功url?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35933188/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com