【问题标题】:JSF 2.0 Sending hidden parameters programatically - ExternalContextJSF 2.0 以编程方式发送隐藏参数 - ExternalContext
【发布时间】:2013-07-15 15:53:36
【问题描述】:

我在jsp页面上提交命令按钮有如下代码

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
    try {
        externalContext.redirect("http://reportsserver.com/reports/rwservlet?server=server001&ORACLE_SHUTDOWN=YES&PARAMFORM=no&report=testrepr.rdf&desformat=pdf&desname=testrep.rdf.pdf&destype=cache&userid=scott/tiger@test&param1=7002&faces-redirect=true");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

xhtml代码是

<h:commandButton value="Submit" action="#{helloWorldBean.submitAction}"></h:commandButton>

我需要在 rwservlet 之后发送所有参数吗?作为隐藏参数。这些值不来自页面上的任何表单域。它们是磁盘上属性文件的一部分。我不希望它们在加载下一个网页或在下一个网页上显示给用户。

如果有任何方法可以将 externalcontext.redirect() 中的特定参数以编程方式标记为隐藏,请告诉我

【问题讨论】:

    标签: jsf


    【解决方案1】:

    这是不可能的。

    您似乎无法理解 HTTP 的一般工作原理(GET、POST、重定向等)。重定向基本上指示客户端在给定的 URL 上触发 GET 请求。但是,为了从请求 URL 中“隐藏”参数,您基本上需要像 POST 请求一样在请求正文中发送它们。在没有最终用户干预的情况下,无法重定向到另一个 POST 请求。

    可以发送307 重定向(ExternalContext#redirect() 默认执行302),但这只会在您似乎想要时重新发送最初提交的 POST 请求参数添加新的请求参数。因此,这是行不通的。即使您设法在原始 POST 请求中通过例如JS/ajax,那么最终用户仍然会得到一个浏览器内置的安全对话,要求确认将提交的数据重新发送到不同的域。这可能会让最终用户感到困惑(如果最终用户以前从未见过这样的警告,它可能会选择中止)。

    也可以充当代理,并使用例如自己以编程方式处理 HTTP 请求。 URLConnection 或 Apache HttpComponents 客户端,但浏览器地址栏中的 URL 在您的域上保持不变。这可能会让最终用户感到困惑(如果它涉及例如在线支付,那么这看起来很像网络钓鱼尝试;一些防病毒程序也可能会失败)。

    另见:

    请注意,在 POST 请求正文中发送参数不一定对最终用户隐藏它们,他/她仍然可以在浏览器的 HTTP 流量监视器中看到它;它们只是在浏览器的地址栏 URL 中不再可见。

    【讨论】:

      猜你喜欢
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多