Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.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
Java Spring安全-禁用注销重定向_Java_Spring_Spring Security - Fatal编程技术网

Java Spring安全-禁用注销重定向

Java Spring安全-禁用注销重定向,java,spring,spring-security,Java,Spring,Spring Security,我将spring安全性与REST结合使用,并将URL(/logout)用作注销方法的端点。但是调用此方法后,它将我重定向到(/login?logout),我知道这是springlogOutSuccessUrl。我想摆脱重定向。这是我的代码: protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/login").perm

我将spring安全性与REST结合使用,并将URL(
/logout
)用作注销方法的端点。但是调用此方法后,它将我重定向到(
/login?logout
),我知道这是spring
logOutSuccessUrl
。我想摆脱重定向。这是我的代码:

protected void configure(HttpSecurity http) throws Exception {

    http.authorizeRequests()
         .antMatchers("/login").permitAll()
         .anyRequest().fullyAuthenticated()
         .and().requiresChannel().anyRequest().requiresSecure()
         .and().httpBasic().disable().logout()
         .disable()
       //  .logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler(HttpStatus.OK))
          .csrf().disable();

}
我尝试使用
HttpStatusReturningLogoutSuccessHandler
,但它不起作用,甚至设置
logoutSuccessUrl()
也不会改变任何东西

您知道如何禁用此重定向吗?

使用此方法:

.logout().logoutSuccessUrl("enter address here where you want to go after logout")

以下代码适用于我(请注意,它没有
logout().disable()


对于那些使用XMLConfig的人来说,下面是与所给代码相同的代码段

元素中,按如下方式配置
元素:

<logout
    logout-url          = "/some/path/for/logout"
    invalidate-session  = "true"
    delete-cookies      = "JSESSIONID"
    success-handler-ref = "httpStatusReturningLogoutSuccessHandler"
/>
<bean
    id      = "httpStatusReturningLogoutSuccessHandler"
    class   = "org.springframework.security.web.authentication.logout.HttpStatusReturningLogoutSuccessHandler"
/>

你可能想试试这个

http.logout().logoutRequestMatcher(新的AntPathRequestMatcher(“/ThisisToMissLeadLogoutFilter”)


这会有效地将/ThisisToMissLeadLogoutFilter重定向到login?logout。因此,您应该能够使用/logout来代替

,因此,由于还没有公认的答案,我发布了我的解决方案,该解决方案对我有效:

.logout()
.logoutUrl("/api/user/logout")
.permitAll()
.logoutSuccessHandler((httpServletRequest, httpServletResponse, authentication) -> {
    httpServletResponse.setStatus(HttpServletResponse.SC_OK);
})
.and()
成功注销后只需返回一个干净的HTTP_OK(200)-在这种情况下spring不会重定向您

对于logoutSuccessXXX()操作,不要忘记添加permitAll(),因为调用logout()方法后cookie被清除。因此,我的示例解决方案是:

         http
            ......
            .and()
                .logout()
                    .logoutUrl("/logout")
                    .logoutSuccessUrl("/logoutSuccess")
                    **.permitAll()**
我用了这个:

    @ResponseStatus(HttpStatus.NO_CONTENT)
@PostMapping(value = "/oauth/revoke")
public void revokeToken(Authentication authentication) {
    ofNullable(authentication).ifPresent(auth -> {
        OAuth2AccessToken accessToken = tokenStore.getAccessToken((OAuth2Authentication) auth);

        ofNullable(accessToken).ifPresent(oAuth2AccessToken -> {
            ofNullable(oAuth2AccessToken.getRefreshToken()).ifPresent(tokenStore::removeRefreshToken);
            tokenStore.removeAccessToken(accessToken);
        });
    });
}

这非常有效。我建议在logout()覆盖上这样做,主要是因为它(很好,它可以工作,但除此之外)保留了oauth2基本流(/oauth/revoke),而不是使用/logout或类似的方法


希望有帮助

OP想要摆脱重定向,因为正在从REST客户端(可能是来自浏览器的AJAX请求)调用/logout。问题是禁用重定向,而不是将其更改为其他url。尝试将spring安全性的日志记录级别设置为debug,这可能会给您一个提示。如果使用SpringBoot,您可以向应用程序添加
logging.level.org.springframework.security=DEBUG
。properties@uncallable你让它工作了吗?我也有类似的问题。尝试了所有的解决方案,但没有任何效果。我使用的是spring security 4.2.0.RELEASE和XML配置,它可以工作。我们不需要显式地传递OK,这是默认值。伙计,你让我开心了。非常感谢,这应该是公认的答案。本文详细介绍了如何禁用注销重定向:
    @ResponseStatus(HttpStatus.NO_CONTENT)
@PostMapping(value = "/oauth/revoke")
public void revokeToken(Authentication authentication) {
    ofNullable(authentication).ifPresent(auth -> {
        OAuth2AccessToken accessToken = tokenStore.getAccessToken((OAuth2Authentication) auth);

        ofNullable(accessToken).ifPresent(oAuth2AccessToken -> {
            ofNullable(oAuth2AccessToken.getRefreshToken()).ifPresent(tokenStore::removeRefreshToken);
            tokenStore.removeAccessToken(accessToken);
        });
    });
}