我有一个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”)返回一个对象,其中所有字段均为null,且仅path=“../jsp/login.jsp”。因此,行为的根必须在响应类中。我查看了文档,发现response.seeother调用response.location方法。文件指出:
如果提供了相对uri,则将通过相对于应用程序的基本uri对其进行解析,将其转换为绝对uri
有人知道jersey如何确定应用程序的基本uri吗?tomcat中是否有配置文件或环境变量设置错误?
1条答案
按热度按时间sr4lhrrt1#
应用程序的基本uri是使用
HttpServletRequest
对象,其形式为:这个
<serverName>
及<serverPort>
通常由http客户端提供,其余由tomcat或应用程序的配置修复:<scheme>
使用的同名属性进行配置<Connector>
(参见tomcat的文档)或可由RemoteIpValve
(参见文件),<serverName>
由http客户端提供,但可以使用proxyName
连接器的属性,<serverPort>
由http客户端提供,但可以使用proxyPort
连接器的属性或由RemoteIpValve
,<contextPath>
取决于您如何部署应用程序(例如,它取决于webapps
目录),<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
:比照这个问题。