jersey如何确定应用程序的基本uri?

qhhrdooz  于 2021-10-10  发布在  Java
关注(0)|答案(1)|浏览(233)

我有一个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中是否有配置文件或环境变量设置错误?

sr4lhrrt

sr4lhrrt1#

应用程序的基本uri是使用 HttpServletRequest 对象,其形式为:

<scheme>://<serverName>:<serverPort>/<contextPath><servletPath>/

这个 <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 , proxyNameproxyPort 在你的 <Connector> ,
使用 RemoteIpValve 并将代理服务器配置为发送原始 Host 标题并添加 X-Forwarded-ForX-Forwarded-Proto 标题。
如果您的代理将不同类型的请求转发给tomcat(例如http和https请求),则 RemoteIpValve 这是你唯一的选择。
备注:如果设置 ServerProperties.LOCATION_HEADER_RELATIVE_URI_RESOLUTION_RFC7231 财产 true :比照这个问题。

相关问题