gpt4 book ai didi

JSF 从 HTTPS 重定向到 HTTP

转载 作者:行者123 更新时间:2023-12-04 14:09:31 25 4
gpt4 key购买 nike

我在测试服务器上有我的应用程序,专门通过 https 执行。当我在没有重定向的情况下导航时,它可以完美运行:

例子:

<p:menuitem value="#{msg.customerScreen}" url="/restrict/customer.xhtml" />
<p:menuitem value="#{msg.productScreen}" url="/restrict/product.xhtml" />

但是当我需要重定向到另一个页面时,它会重定向到 http 而不是 https。通过 http 使用时,它可以完美运行:
<p:commandLink ajax="false" action="/commerce/store.xhtml?faces-redirect=true">
<h:graphicImage library="images/BTN" name="btn_to_shop.gif"/>
</p:commandLink>

作为一种解决方法,我尝试重建 URL:
<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,但 JSF 没有重定向到新的 URL。

JBoss 正在接收 HTTP 连接。管理 HTTPS 的是 Apache,它重定向到 JBoss:
<VirtualHost *:443>

...

ProxyPass / http://server:8080/
ProxyPassReverse / http://server:8080/
</VirtualHost>

我更愿意在不使用 getCompleteURL 的情况下解决此问题,但如果不可能,请帮助我使用其他方法。

最佳答案

我找到了这个问题的解决方案。我认为这是因为 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>

关于JSF 从 HTTPS 重定向到 HTTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20905128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com