我的测试服务器上的应用程序是通过https专门执行的。当我在没有重定向的情况下导航时,它可以完美地运行:
示例:
<p:menuitem value="#{msg.customerScreen}" url="/restrict/customer.xhtml" />
<p:menuitem value="#{msg.productScreen}" url="/restrict/product.xhtml" />
但是当我需要重定向到另一个页面时,它会重定向到http而不是https。使用over http时,它可以很好地工作:
<p:commandLink ajax="false" action="/commerce/store.xhtml?faces-redirect=true">
<h:graphicImage library="images/BTN" name="btn_to_shop.gif"/>
</p:commandLink>
作为一种解决方法,我尝试重建网址:
<p:commandLink ajax="false" action="#{authorizerBean.getCompleteURL('/commerce/store.xhtml?faces-redirect=true')}">
<h:graphicImage library="images/BTN" name="btn_to_shop.gif"/>
</p:commandLink>
public String getCompleteURL(String page) {
try {
FacesContext ctxt = FacesContext.getCurrentInstance();
ExternalContext ext = ctxt.getExternalContext();
URI uri = new URI(ext.getRequestScheme(), null, ext.getRequestServerName(), ext.getRequestServerPort(), ext.getRequestContextPath(), null, null);
return uri.toASCIIString() + page;
} catch (URISyntaxException e) {
throw new FacesException(e);
}
}
正在调用方法getCompleteURL并返回URL correclty,但JSF未重定向到新URL。
JBoss正在接收HTTP连接。谁管理HTTPS是Apache,重定向到JBoss:
<VirtualHost *:443>
...
ProxyPass / http://server:8080/
ProxyPassReverse / http://server:8080/
</VirtualHost>
我更愿意在不使用getCompleteURL的情况下解决此问题,但如果不可能,请帮助我解决其他方法。
答案 0 :(得分:5)
我找到了解决此问题的方法。我认为它正在发生,因为Apache接收https连接并通过http转发JBoss。然后,当我重定向到另一个页面时,JSF不知道它应该通过https。
使用ConfigurableNavigationHandler,我可以在重定向时拦截并挂载正确的URL。
public class NavigationHandler extends ConfigurableNavigationHandler {
private ConfigurableNavigationHandler concreteHandler;
public NavigationHandler(ConfigurableNavigationHandler concreteHandler) {
this.concreteHandler = concreteHandler;
}
@Override
public void handleNavigation(FacesContext context, String fromAction, String outcome) {
if (outcome != null && outcome.contains("faces-redirect=true")) {
try {
outcome = "https://server.com/project" + outcome;
context.getExternalContext().redirect( outcome );
} catch (IOException e) {
throw new FacesException(e);
}
} else {
concreteHandler.handleNavigation(context, fromAction, outcome);
}
}
}
在faces-config.xml中:
<application>
<navigation-handler>com.example.NavigationHandler</navigation-handler>
</application>
答案 1 :(得分:0)
另一种解决方法是设置
RequestHeader set X-Forwarded-Proto https
RequestHeader set X-Forwarded-Port 443
在Apache中的VirtualHost上。
然后,JSF将知道重定向应该是HTTPS连接,并且不需要更改代码。
我已经在Apache和Wildfly中使用了它。