0

我在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() 中的特定参数标记为隐藏

4

1 回答 1

4

那是不可能的。

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

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

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

也可以看看:

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

于 2013-07-15T16:21:28.367 回答