有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    应用程序的基本URI是使用^{}对象的属性计算的,其形式如下:

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

    <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,有两种选择:

    1. 静态配置schemesecureproxyNameproxyPort<Connector>上的正确值
    2. 使用RemoteIpValve并将代理服务器配置为发送原始Host头并添加X-Forwarded-ForX-Forwarded-Proto

    如果您的代理将不同类型的请求转发给Tomcat(例如HTTP和HTTPS请求),那么RemoteIpValve是您唯一的选择

    备注:如果将ServerProperties.LOCATION_HEADER_RELATIVE_URI_RESOLUTION_RFC7231属性设置为true:cf.this question,则基本URI也可以基于请求URI