您需要
logoutSuccessHandler代替下面的
.logoutSuccessUrl("/login?logout")配置
logoutSuccessHandler
@Overrideprotected void configure(final HttpSecurity http) throws Exception{ http .authorizeRequests() .antMatchers("/resources/**", "/", "/login", "/api/**") .permitAll() .antMatchers("/app/admin/*") .hasRole("ADMIN") .antMatchers("/app/user/*") .hasAnyRole("ADMIN", "USER") .and().exceptionHandling().accessDeniedPage("/403") .and().formLogin() .loginPage("/login").usernameParameter("userName") .passwordParameter("password") .defaultSuccessUrl("/app/user/dashboard") .failureUrl("/login?error=true") .and().logout() .logoutSuccessHandler(new CustomLogoutSuccessHandler()) .invalidateHttpSession(true) .and().csrf().disable(); http.sessionManagement().maximumSessions(1).expiredUrl("/login?expired=true");}我考虑过写自己的/ logout处理程序
实际上,这不是注销处理程序,而是注销启动器。
使用CustomLogoutSuccessHandler,可以在其中获取请求参数,然后可以再次设置它,如下所示。
import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.security.core.Authentication;import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler;public class CustomLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler{ @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { cookie cookie = new cookie("JSESSIONID", null); cookie.setPath(request.getContextPath()); cookie.setMaxAge(0); response.addcookie(cookie); if(request.getParameter("expired") != null) { response.sendRedirect(request.getContextPath()+"/login?expired=true"); } else { response.sendRedirect(request.getContextPath() + "/login?logout=true"); } }}从我的应用程序中,我发出了这个Spring Security注销URL(注销是自动的,因此我没有特定的处理程序)
servlet / spring安全性没有自动注销功能。只有我们能实现的是
1.自动化客户端以发送注销请求
。2.在服务器中,我们可以设置会话的maxInactiveInterval,以便可以通过删除cookie
/将cookie的使用期限设置为过去的日期来使会话无效。一旦会话对下一个请求无效,spring安全过滤器链中的一个过滤器会将其重定向到/ param过期的/
login页面。
/login?expired
如果您启动注销,spring security将删除cookie /使会话无效,并使用param注销重定向到/
login页面。
/login?logout
在Spring Security中,有两种配置可以实现注销。
.and().logout().invalidateHttpSession(true)//or.deletecookies("JSESSIONID")编辑:看到OP的答案后。 缺少在此处添加的信息。OP和我在临时答案(该聊天和答案已被删除)中进行了长时间聊天,我们在其中找到了 LOGIN-
WALL 。
“登录墙”是配置错误的结果,您将在其中定义一个自定义登录页面,并将其配置为在身份验证后允许访问的资源。(
access=isAuthenticated),但如果我们在使会话无效的情况下重定向到登录页面,则从CustomLogoutSuccessHandler进行弹簧安全性阻止登录页面访问(401-未授权),因为该页面仅允许经过身份验证的用户使用。阻止Spring安全性后,将负责重定向到配置中配置的页面。`.loginPage(“
/ someloginpage”)。它迫使人们认为注销正确发生,可以正确重定向到登录页面,但是我在查询字符串中发送的参数没有进入登录页面。
如果我称其为难题,那没错,这很难猜 。



