java Jersey如何确定应用程序的基本URI?
我有一个java应用程序在tomcat中运行。在应用程序的一个端点中,我希望返回See Other类型的HTTP响应
@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();
}
当我在本地机器上测试时,一切正常。然而,在生产系统上,jersey似乎无法从相对路径“./jsp/login.jsp”解析正确的主机名。虽然主机名为myhost,但相对路径解析为http://localhost:7080/myapplication/jsp/login.jsp.
新的URI(“../jsp/login.jsp”)返回一个对象,其中所有字段都为空,并且只有path=“../jsp/login.jsp”。因此,行为的根必须在Response类中。我查看了文档,并得出了答案。seeOther致电回应。定位方法。文件表明
If a relative URI is supplied it will be converted into an absolute URI by resolving it relative to the base URI of the application
有人知道Jersey是如何确定应用程序的基本URI的吗?tomcat中是否有配置文件或环境变量设置错误
# 1 楼答案
应用程序的基本URI是使用^{} 对象的属性计算的,其形式如下:
<serverName>
和<serverPort>
通常由HTTP客户机提供,其余的由Tomcat或应用程序的配置修复:<scheme>
使用<Connector>
(cf.Tomcat's documentation)的同名属性进行配置,或者可以通过RemoteIpValve
(cf.documentation)进行设置<serverName>
由HTTP客户端提供,但可以使用连接器的proxyName
属性重写<serverPort>
由HTTP客户端提供,但可以使用连接器的proxyPort
属性或RemoteIpValve
来覆盖<contextPath>
取决于您如何部署应用程序(例如,它取决于webapps
目录中WAR文件的名称)<servletPath>
在web.xml
描述符中或通过@ApplicationPath
注释进行配置李>在您的生产环境中可能发生的情况是,Tomcat在一个反向代理之后。要在这种情况下正确配置基本URI,有两种选择:
scheme
、secure
、proxyName
和proxyPort
在<Connector>
上的正确值RemoteIpValve
并将代理服务器配置为发送原始Host
头并添加X-Forwarded-For
和X-Forwarded-Proto
头李>如果您的代理将不同类型的请求转发给Tomcat(例如HTTP和HTTPS请求),那么
RemoteIpValve
是您唯一的选择备注:如果将
ServerProperties.LOCATION_HEADER_RELATIVE_URI_RESOLUTION_RFC7231
属性设置为true
:cf.this question,则基本URI也可以基于请求URI