如何以编程方式将POST请求发送到JSF页面而不使用HTML表单?

pWo*_*Woz 5 jsf http-post jsf-2 http-request-parameters

我有非常简单的JSF bean,如下所示:

import org.jboss.seam.annotations.Name;

@Name(Sample.NAME)
public class Sample {

    public static final String NAME="df";

    private String text = "text-test";

    public void sampleM(){
        System.out.println("Test: "+text);
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}
Run Code Online (Sandbox Code Playgroud)

和JSF表单连接这个组件:

<h:form id="sampleForm">
        <h:commandButton id="sampleButton" action="#{df.sampleM()}" value="ok" />
</h:form>
Run Code Online (Sandbox Code Playgroud)

现在,我想以编程方式将POST请求发送到此表单.

根据我的调查,这里的关键是POST参数.正确选择可以得到正确的结果(字符串'测试:文本测试'打印在serwer的控制台上).

所以问题是:我应该如何选择正确的POST数据?

上面显示的JSF表单生成此HTML表单:

<form id="sampleForm" name="sampleForm" method="post" action="/pages/main/main.smnet" enctype="application/x-www-form-urlencoded">
    <input type="hidden" name="sampleForm" value="sampleForm" />
    <input id="sampleForm:sampleButton" type="submit" name="sampleForm:sampleButton" value="ok" />
    <input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="j_id65" autocomplete="off" />
</form>
Run Code Online (Sandbox Code Playgroud)

所以这些参数是正确的.

但是,如何找出哪些参数(名称和值)对于任何其他组件都足够了?

例如:当我发送的POST数据与显示的HTML表单相同但具有不同的'javax.faces.ViewState'参数值时,将不会执行组件方法.

Bal*_*usC 11

我知道您基本上是在询问如何使用某些HTTP客户端(例如java.net.URLConnectionApache HttpComponents Client)以编程方式提交JSF表单,对吧?

您需要首先发送GET请求,并确保JSESSIONID跨请求维护相同的HTTP会话(基本上是cookie).让您的HTTP客户端Set-Cookie从第一个GET请求的响应中提取标头,从中获取JSESSIONIDcookie并将其作为Cookie后续POST请求的标头发回.这将在服务器端维护HTTP会话,否则JSF会将其视为"View Expired",它可能会返回一个配置正确的JSF Web应用程序,一个HTTP 500错误页面ViewExpiredException,或者在一个配置不当的JSF Web应用程序上页面刷新.

作为JSF的有状态性质和隐含的CSRF攻击防范的一部分,必须使用有效值提交表单,javax.faces.ViewState因为客户端已在初始GET请求中检索自身.您还需要确保发送name=value所有其他隐藏字段对,尤其是提交按钮之一.

因此,如果您的初始GET请求为您提供此HTML

<form id="sampleForm" name="sampleForm" method="post" action="/pages/main/main.smnet" enctype="application/x-www-form-urlencoded">
    <input type="hidden" name="sampleForm" value="sampleForm" />
    <input id="sampleForm:sampleButton" type="submit" name="sampleForm:sampleButton" value="ok" />
    <input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="j_id65" autocomplete="off" />
</form>
Run Code Online (Sandbox Code Playgroud)

那么你需要解析它(Jsoup可能对此有帮助)并提取以下请求参数:

  • sampleForm=sampleForm
  • sampleForm:sampleButton=ok
  • javax.faces.ViewState=j_id65

最后发送一个POST请求/pages/main/main.smnet,确切地说是那些请求参数(以及JSESSIONIDcookie!).不过要小心,它可能是一个(差)JSF开发者已经跳过如id="sampleButton"<h:commandButton>再JSF会自动生成一个看起来像这种格式sampleForm:j_id42.您不能对它们进行硬编码,因为值可能会根据组件在服务器端树中的位置而改变,然后您真的需要将其解析出所获得的HTML.

尽管如此,与网站所有者/管理员联系并询问是否没有可用于您所考虑的任务的Web服务API是明智之举.一个使用JSF应用程序进行HTML前端的体面Java EE网站通常也会为REST前端使用单独的JAX-RS应用程序.

也可以看看:


归档时间:

查看次数:

18938 次

最近记录:

8 年,1 月 前