JSF 和/或 PrimeFaces 样式表和脚本转到 /Project/javax.faces.resource 位置



我使用Nginx的proxy_pass选项将"myproject.com"(例如)设置为"http://localhost:8080/MyProject/"。一切正常,但PrimeFaces样式表和脚本尝试转到"/MyProject/file",这并不好,因为代理到不存在的"http://localhost:8080/MyProject/MyProject/file"。如何使 PF 使用 ./file 而不是/MyProject/file?使Nginx的位置块或链接到MyProject文件夹是不好的变体。

尽管我有强烈的印象,这个问题确实需要在 Ngnix 代理端解决,但我将解释如何从 JSF 端"解决"它。

JSF 资源由 Resource 类表示,其中 getRequestPath() 方法负责返回资源 URL。您可以创建自定义Resource实现,其中相应地实现/覆盖getRequestPath()

public class MyResource extends ResourceWrapper {
    private Resource wrapped;
    public MyResource(Resource wrapped) {
        this.wrapped = wrapped; 
    }
    @Override
    public String getRequestPath() {
        String contextPath = FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath();
        return "." + wrapped.getRequestPath().substring(contextPath.length());
    }
    @Override
    public Resource getWrapped() {
        return wrapped;
    }
}

现在,要重写此自定义实现的默认 JSF Resource,您需要创建一个自定义ResourceHandler实现,其中您将自定义Resource实现改为在 createResource() 方法中返回。

public class MyResourceHandler extends ResourceHandlerWrapper {
    private ResourceHandler wrapped;
    public MyResourceHandler(ResourceHandler wrapped) {
        this.wrapped = wrapped;
    }
    @Override
    public Resource createResource(String resourceName, String libraryName) {
        return new MyResource(wrapped.createResource(resourceName, libraryName));
    }
    @Override
    public ResourceHandler getWrapped() {
        return wrapped;
    }
}

最后,要使其运行,请将其注册为faces-config.xml中的<resource-handler>

<application>
    <resource-handler>com.example.MyResourceHandler</resource-handler>
</application>

我对这个答案有点晚了,但我遇到了同样的问题,并尝试以"nginx"的方式进行。

所以也许这也有助于其他人。

您可以在 NGINX 配置中定义第二个位置(这肯定取决于您的特定配置),该位置将与与该位置模式匹配的每个流量的特定规则匹配。

您在 nginx 服务器配置中的第一个位置看起来与此有些相似:

    location / {
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://localhost:8080/MyProject$request_uri;
    }

然后你只需要为你的资源添加第二个位置,这将告诉nginx不要在重写中为与特定位置模式匹配的资源添加MyProject,例如:

    location /MyProject {
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://localhost:8080$request_uri;
    }

请注意,"/MyProject/javax.faces.resource"的proxy_pass已更改。您的 js、图像和 css 现在应该再次正确交付。

有关位置的更多信息可以在nginx文档中找到。

最新更新