JSF 从 HTTPS 重定向到 HTTP

2023-12-13

我的应用程序位于测试服务器上,仅通过 https 执行。当我在不重定向的情况下导航时,它工作得很好:

Example:

<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> 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSF 从 HTTPS 重定向到 HTTP 的相关文章

随机推荐

  • 如何使用 Python(不使用 PySpark)将 pandas 数据框插入现有的 Hive 外部表?

    我正在创建一个到 Hive 的连接字符串 并在该连接上的 Hive 表上运行一些 SELECT 查询 对检索到的数据执行一些转换后 我正在创建一个数据框df student credits看起来如下 NAME STUDENT INITIAL
  • 如何降级 Angular CLI 版本

    我已经更新了我的 Angular cli 版本 现在它显示 Angular 5 2 0 我在 Angular 4 中构建了整个代码 您能帮我完成降级我的 Angular cli 版本 特定版本 的步骤 以便我拥有 Angular4 这是我当
  • 每次使用 Rsync 保存时上传文件

    我使用 Eclipse PDT Ubuntu 10 10 进行 Web 开发 并使用 Rsync 手动成功上传更改的文件 rsync e ssh av home goksel Sites test email protected test
  • 如何从表中删除行

    这个问题是这个问题的后续问题 在 SAPUI5 表中添加新行的按钮 在我的新场景中 我在表格的第一列中添加了一个 删除 按钮 同样 JSON 文件如下所示 Invoices ProductName Pineapple Quantity 21
  • Rails、Chartkick:在图表上显示值

    The 图表踢gem 可以让您创建多种图表 目前 我的图表如下所示 饼图 institutions 柱形图 stats 我希望这些值显示在图表上 在饼图中 我希望数字 244 和 43 在饼图内部或外部可见 在柱形图中 我希望将值放在顶部或
  • 如何在 python xml.etree.ElementTree 中删除迭代器内的节点

    如何删除当前节点 同时迭代从根开始的所有节点getiterator 功能 import xml etree ElementTree as ET tree ET parse file xml root tree getroot for nod
  • 使用 Spring security JPA 进行多租户

    这是这个的后续Spring JPA 的多租户 我选择使用 AbstractRoutingDataSource 但现在的问题是数据源和实体管理器 bean 在启动时初始化 无论如何 有没有在春天配置这个 它会在用户通过身份验证后初始化 我能想
  • iphone:如何在 UITableView 中创建多列[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 UITableView 中显示多列 我有多行和多列数据 但 iPhone UITableView 仅包含单列和多行 如何按照 Apple 的人机界面指南显示多列数据 有任何想法吗 使用 Gri
  • Android sendTextMessage 在执行时发送两条相同的消息

    我一直在开发一个发送短信的应用程序 我遇到的问题是 sendTextMessage 方法发送两条内容相同的消息 我该如何解决这个问题 这个类开始了这个过程 public class C2DMMessageReceiver extends B
  • Ada 中有“this”关键字吗?

    具体来说 任务有没有办法获得对其自身的引用 例如 task type someTask type someTaskAccessor is access someTask task body someTask is pointerToTask
  • 缺少 .bpl 文件

    编译 FireMonkey 项目并在另一台 PC 上执行该应用程序后 我遇到了错误 rtl190 bpl 丢失 所以我搜索了谷歌 找到了对我不起作用的 解决方案 它说我应该取消选中 与动态 RTL 链接 和 与 Delphi 运行时链接 事
  • 如果我们在 itext 中使用 ttf 文件,是否需要拥有字体许可证? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 据我所知 itext 不附带任何字体库 您需要提供字体库 pdf一旦生成 将由Acrobat查看 并假设它是标准字体 adobe将支持它 我的问题是关于字体的许可 a 我需要获得在
  • 如何使内联块元素填充行的其余部分?

    使用CSS和两个内联块 或其他 DIV标签而不是使用表格可以实现这样的事情吗 表格版本是这样的 添加了边框以便您可以看到它 table style width 100 tr td style border 1px solid black w
  • 使用 sftp 和 Maven 上传目录

    如何在 Maven 中使用 sftp 和公钥身份验证上传目录 Eclipse 更新站点 有关背景信息 我正在使用 tycho 构建 Eclipse 插件并想要获取更新站点
  • 检查 Google 表格单元格是否受到 Google Apps 脚本的保护 [重复]

    这个问题在这里已经有答案了 如何检查 Google 表格中的单元格是否受到 Google Apps 脚本的保护 具体来说 是范围保护 而不是表保护 检查单元格是否具有坐标row and col 从1开始 有保护用途 function has
  • 随机生成独特的颜色?

    我正在使用一个可以绘制颜色线的绘图包 255 255 255 所以基本上我正在做的是 Random Next 0 255 Random Next 0 255 Random Next 0 255 每次添加一行时生成一种颜色 这一切都很好 但有
  • WPF:如何在 Xaml 中使用枚举填充组合框

    我知道有多种方法可以做到这一点 但如果可能的话 我想让它变得更容易 因为我有很多组合框可以通过这种方式绑定 有一个使用 ObjectDataProvider 的建议here 问题是我必须为每个枚举创建一个资源条目 而且数量很多 到目前为止
  • 数组到字符串的转换并且只有变量应该通过引用传递

    我对 php 没有经验 我是新人 我正在尝试使用这段代码http mach13 com how to get a variable name as a string in php查找变量的名称 但我不断收到 该行的数组到字符串转换 aDif
  • 如何使用 jQuery 实现 的 onchange?

  • JSF 从 HTTPS 重定向到 HTTP

    我的应用程序位于测试服务器上 仅通过 https 执行 当我在不重定向的情况下导航时 它工作得很好 Example