gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:02:24 24 4
gpt4 key购买 nike

我有一个非常简单的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;
}
}

并与该组件连接的JSF形式:
<h:form id="sampleForm">
<h:commandButton id="sampleButton" action="#{df.sampleM()}" value="ok" />
</h:form>

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

根据我的调查,这里的关键是POST参数。
正确选择将给出正确的结果(字符串“Test:text-test”打印在服务器的控制台上)。

因此,问题是: 我应如何选择正确的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>

因此,这些参数是正确的。

但是我如何找出对其他任何组件都足够的参数(名称和值)?

例如:当我发送POST数据(如所示的HTML格式)相同,但参数值不同,即为'javax.faces.ViewState',则组件方法将不会执行。

最佳答案

我了解您基本上是在问如何使用某些HTTP客户端(例如java.net.URLConnection或Apache HttpComponents客户端)以编程方式提交JSF表单,对吗?

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

作为JSF有状态性质和隐含CSRF攻击防范的一部分,由于客户端已在初始GET请求中自行检索到表单,因此必须使用有效的javax.faces.ViewState值提交表单。您还需要确保发送所有其他隐藏字段的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>

那么您需要对其进行解析( Jsoup可能会有所帮助)并提取以下请求参数:
  • sampleForm=sampleForm
  • sampleForm:sampleButton=ok
  • javax.faces.ViewState=j_id65

  • 最后,使用确切的请求参数(和 /pages/main/main.smnet cookie!)在 JSESSIONID上发送POST请求。不过请注意,(贫穷的)JSF开发人员可能会跳过例如从 id="sampleButton"生成 <h:commandButton>,然后JSF会自动生成一个类似于 sampleForm:j_id42格式的代码。您不能对它们进行硬编码,因为值可能会根据组件在服务器端树中的位置而变化,然后您真的需要将其解析为获取的HTML。

    但是,明智的做法是与网站所有者/管理员联系,并询问是否没有可用于您所计划任务的Web服务API。一个使用JSF应用程序作为HTML前端的体面的Java EE网站通常还使用一个单独的JAX-RS应用程序作为REST前端。

    也可以看看:
  • How can i programmatically upload a file to a website?(这也涉及JSF)
  • Using java.net.URLConnection to fire and handle HTTP requests
  • 关于jsf - 如何以编程方式将POST请求发送到JSF页面而不使用HTML表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12175763/

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