首页 > 解决方案 > java.net.URI 如何解析相对 URI?

问题描述

我有一个在 tomcat 中运行的带有登录机制的 java 应用程序。当用户单击“注销”时,应用程序应该将他重定向回登录页面。因此,当用户单击“注销”时,将调用端点 /logout,执行注销逻辑,然后将用户重定向回登录页面。

@GET
@Path("logout")
@Produces(MediaType.TEXT_HTML)
public Response logOut(@Context HttpServletRequest request) throws URISyntaxException {
    // logout logic omitted
    Response.ResponseBuilder response = Response.seeOther(new URI("../jsp/login.jsp"));
    return response.build();
}

当我在本地机器上测试它时,一切正常。相对路径“../jsp/login.jsp”转换为http://localhost:8080/myapplication/jsp/login.jsp。然而,在生产系统上,url 的权限部分不是生产系统的地址,而是 http://localhost:7080/myapplication/jsp/login.jsp。

这就是为什么我想问 java.net.URI 如何解析相对 URL?在 文档中,它说“分层 URI 的权限组件(如果指定)是基于服务器的或基于注册表的。” 这是什么意思?我的tomcat中是否有我或我的一位同事设置错误主机的文件?我感谢各种建议,帮助我从哪里开始寻找这个问题的原因。

标签: javatomcatjersey

解决方案


javadoc for是这样说的URI.resolve(URI)

public URI resolve(URI uri)

根据此 URI 解析给定的 URI。

因此,您的问题的答案是 servlet 基础结构正在针对其他 URI 解析“../jsp/login.jsp”。您在代码中创建的 URI 将是上面的“给定 URI”。

它是针对哪个 URI 解析的?

好吧,它看起来像是当前上下文的基本 URI。

但最重要的是,决定解决什么问题的不是 Java。决定权的是 webapp 框架和/或 Tomcat。这就是您应该寻找对所见事物的解释的地方。


推荐阅读