java - 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中是否有我或我的一位同事设置错误主机的文件?我感谢各种建议,帮助我从哪里开始寻找这个问题的原因。
解决方案
javadoc for是这样说的URI.resolve(URI)
:
public URI resolve(URI uri)
根据此 URI 解析给定的 URI。
因此,您的问题的答案是 servlet 基础结构正在针对其他 URI 解析“../jsp/login.jsp”。您在代码中创建的 URI 将是上面的“给定 URI”。
它是针对哪个 URI 解析的?
好吧,它看起来像是当前上下文的基本 URI。
但最重要的是,决定解决什么问题的不是 Java。决定权的是 webapp 框架和/或 Tomcat。这就是您应该寻找对所见事物的解释的地方。
推荐阅读
- maven - 如何从 Maven 项目中引用公共 GitHub 包
- python - Python在迭代下替换字典键的行为
- java - Java 泛型 Wild 用法和对象
- linux - 如何从屏幕上获取一个像素的值(GTK 3、Shell、Linux)
- javascript - 当用户选择特定选项时,如何使 div 出现?
- joomla - 安装 k2 组件 2.10.3 后,Joomla 多语言站点 HTML 标记属性不会更改
- velo - 从数据库设置中继器值
- flutter - 如何取消选择列表view.builder颤振中已选择的选项
- django - 如何在 Django 模板中使用“for”语句
- c++ - 如何将 cout 的输出存储到变量中