Nginxのproxy_passオプションを使用して、(たとえば)「myproject.com」を「http://localhost:8080/MyProject/」のようにしました。すべて正常に動作しますが、PrimeFaces のスタイルシートとスクリプトは "/MyProject/file" に移動しようとします。これは、存在しない "http://localhost:8080/MyProject/MyProject/file" にプロキシするため、良くありません。PF で /MyProject/file の代わりに ./file を使用するにはどうすればよいですか? Nginx のロケーション ブロックまたは MyProject フォルダーへのリンクを作成することは、不適切なバリアントです。
質問する
1565 次
2 に答える
1
この問題は本当に Ngnix プロキシ側で解決する必要があるという強い印象がありますが、JSF 側からどのように「回避」できるかを説明します。
JSF リソースは、メソッドがリソース URL を返す役割を担うResource
クラスによって表されます。それに応じて が実装/オーバーライドさgetRequestPath()
れるカスタム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;
}
}
最後に、実行するために、 として登録し<resource-handler>
ますfaces-config.xml
。
<application>
<resource-handler>com.example.MyResourceHandler</resource-handler>
</application>
于 2012-08-13T14:06:55.677 に答える