如何在Javaservlet中以编程方式提交表单?

如何在Javaservlet中以编程方式提交表单?,java,forms,servlets,Java,Forms,Servlets,我有一个java servlet,它从域a中的一个网页获取表单请求,它将处理表单,并将结果作为请求发送到域B中的另一个网页 我想知道如何在Javaservlet中以编程方式提交表单?我试着用 javax.servlet.RequestDispatcher.forward(request, response) 但它不起作用,因为它只能转发到同一域中的资源。尝试使用它 从图中可以看出,代码如下所示: HttpClient client = new HttpClient(); GetMethod m

我有一个java servlet,它从域a中的一个网页获取表单请求,它将处理表单,并将结果作为请求发送到域B中的另一个网页

我想知道如何在Javaservlet中以编程方式提交表单?我试着用

javax.servlet.RequestDispatcher.forward(request, response)
但它不起作用,因为它只能转发到同一域中的资源。

尝试使用它

从图中可以看出,代码如下所示:

HttpClient client = new HttpClient();
GetMethod method = new PostMethod(url);
int statusCode = client.executeMethod(method);
... etc 

有很多选项可以自定义它。

尝试一个由域a上的Servlet返回的javascript自动提交表单

域A上的Servlet:

public void doPost(HttpServletRequest req, HttpServletResponse resp) {
  PrintWriter p = resp.getPrintWriter();
  p.print("<form id='f' action=[URL on domain B to login]><input type='secret' name='username' value='" + username+ "'/><input type='secret' name='password' value='" + password + "'/></form>");
  p.print("<script type='text/javascript'>document.getElementById('f').submit()");
}
public void doPost(HttpServletRequest-req、HttpServletResponse-resp){
PrintWriter p=resp.getPrintWriter();
p、 打印(“”);
p、 打印(“document.getElementById('f').submit()”);
}

这将不是最优雅的解决方案,但如果您正在寻找更具企业精神的解决方案,请尝试SSO解决方案,如OpenSSO或CAS。

您需要自动发布到新域。只需将请求转发到JSP,如下所示

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<body onload="document.forms[0].submit()">
<noscript>
<p>
<strong>Note:</strong> Since your browser does not support JavaScript,
you must press the Continue button once to proceed.
</p>
</noscript>

<jsp:useBean id="myBean" scope="request" class="example.myBean" />

<form action="<jsp:getProperty name="myBean" property="url"/>" method="post">
<div>
<input type="hidden" name="field1" value="<jsp:getProperty name="myBean" property="field1"/>"/>
...
</div>
<noscript>
<div>
<input type="submit" value="Continue"/>
</div>
</noscript>
</form>
</body>
</html>


注意:由于您的浏览器不支持JavaScript,
必须按一次“继续”按钮才能继续。

...

“myBean”包含重定向URL,字段值需要发布到另一个域。

这里有一个大问题:您是否希望将请求提交到另一个站点,而不担心进一步的响应?或者您仍然希望对响应拥有完全的控制权,以便能够像在您自己的域中一样进行呈现?这在您的topicstart中没有明确说明


如果是第一个,则使用前面推荐的Javascript自动提交onload方法。如果是第二个,那么使用前面推荐的
HttpClient
建议(或者如果您对HTTP非常了解,也可以使用
java.net.URLConnection
)。

是个好主意,但这实际上取决于原始海报想要什么。使用ApacheHttpClient使服务于Servlet的服务器成为客户端。因此,请求Servlet页面的实际客户端没有登录。非常感谢。这会转发到域B上的另一个页面吗?我目前不知道转发将如何在域A中的servlet中工作;哦,我明白了,这是有道理的@智慧:不会的。您可以尝试提交表单,然后在响应中编写一个老式重定向(HTTP-EQUIV=Refresh等),但正如Isiu所指出的,您的最终客户机不会被第二台服务器识别。该服务器应该允许您以编程方式启动远程会话。这意味着Servlet域a将返回JS,该JS在其加载中具有自动提交功能,并将其提交到域B,对吗?唯一的问题是客户端(如果是浏览器)将显示什么?可以通过CSS设置窗体的可见性以隐藏窗体。谢谢。这种方法应该适用于PC上的浏览器,但问题是我的客户端是一部手机,其浏览器不允许自动提交表单,除非用户明确单击按钮或链接触发提交。