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

时间:2012-08-13 13:28:20

标签: jsf nginx primefaces

我制作了#34; myproject.com" (例如)as as" http:// localhost:8080 / MyProject /"使用Nginx的proxy_pass选项。一切正常,但是PrimeFaces样式表和脚本试图转到" / MyProject / file",由于代理不存在而导致什么不好" http:// localhost:8080 / MyProject / MyProject的/文件&#34 ;. 如何使用./file代替/ MyProject /文件?制作Nginx的位置块或链接到MyProject文件夹是不好的变种。

2 个答案:

答案 0 :(得分:1)

即使我有强烈的印象,这个问题确实需要在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实现,您可以在createResource()中返回自定义Resource实现方法。

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;
    }

}

最后,为了让它运行,请在<resource-handler>中将其注册为faces-config.xml

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

答案 1 :(得分:0)

我对这个答案有点迟了,但我遇到了同样的问题,并尝试将其作为&#39; nginx&#39;方式。

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

您可以在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;
    }

请注意,对于&#39; /MyProject/javax.faces.resource',proxy_pass已更改。您的js,图像和CSS现在应该再次正确发送。

有关位置的更多信息,请参阅nginx documentation