java - 在 Spring Boot 中使用相对重定向失败

标签 java spring spring-boot nginx redirect

场景

我有一个 spring-boot 应用程序,可以使用上下文而不是域根来访问它:

问题

登录成功后,使用经典配置:

formLogin()
    .loginPage("/login")
    .defaultSuccessUrl("/my_form")

将我重定向到:http://app.com/my_form抛出错误,因为 url 必须是: http://app.com/organization_a/my_form

所以,我尝试使用相对网址(注意/my_form之前的点)./my_form而不是/my_form

formLogin()
    .loginPage("/login")
    .defaultSuccessUrl("./my_form")

Spring 向我抛出此错误:由于 spring-security-web jar 中的此验证,defaultTarget 必须以“/”或“http(s)”开头:

//org.springframework.security.web.authentication.AbstractAuthenticationTargetUrlRequestHandler
public void setDefaultTargetUrl(String defaultTargetUrl) {
    Assert.isTrue(UrlUtils.isValidRedirectUrl(defaultTargetUrl),
            "defaultTarget must start with '/' or with 'http(s)'");
    this.defaultTargetUrl = defaultTargetUrl;
}

So, I can say: Classic default success url method does not allow to use relative urls, because if I use root domain , works like charm as in my localhost.

相对网址与绝对网址

更多信息here

我在 java 中的 html 和资源以及 PHP 和 Nodejs 等其他语言中也遇到了类似的问题。

基本上,如果您使用上下文而不是应用程序的域根,则必须需要更改此设置:

<link href="/vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet"/>

<link href="./vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet"/>

注意/vendor/bootstrap/... 之前的点

如果没有这个点,您的资源将不会下载,因为浏览器请求的网址如下:

什么时候应该:

当前的解决方法

  • 使用域或子域代替上下文。
    • 这很费力,因为我需要为每个新应用程序向我的 ISP 开具一张票证。
  • 将整个 URL 放入 defaultSuccessUrl 方法中。
    • 这太糟糕了,因为我的应用程序无法移植,因为我必须在构建之前设置绝对网址:
    formLogin()
        .loginPage("/login")
        .defaultSuccessUrl("http://app.com/organization_a/my_form")

问题

Is there a way to use relative redirect in spring security?

我正在使用最新的 Spring Boot 版本之一:2.1.7.RELEASE

感谢任何帮助或评论。

谢谢

最佳答案

我设法通过以下 spring 属性启用相对重定向:

server:
  tomcat:
    use-relative-redirects: true

关于java - 在 Spring Boot 中使用相对重定向失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57503924/

相关文章:

java - Mockk - 模拟实现多个接口(interface)的最终类​​时出现 ClassCastException

java - jpa实体管理器回滚不起作用

java - Spring Boot REST API 的 @PutMapping 和 @DeleteMapping 的 HTTP 状态?

maven - Spring Boot 和 Maven war 覆盖

java - 连接到github/bitbucket存储库时,自动化的Spring Boot Docker Image无法在Docker Hub上构建

java - 启动对话框式 Activity 时出现意外行为

java - startsWith String 方法似乎无法正常工作

java - 如何将 util.Date 转换为 time.LocalDate 以正确处理 1893 年之前的日期

java - Gradle 不适用于 Spring Boot 示例应用程序。为什么不?

java - 如何在 Spring 中添加来自另一个模块的 bean 依赖项?