使用 Java 提交表单

Posted

技术标签:

【中文标题】使用 Java 提交表单【英文标题】:Form submit using Java 【发布时间】:2011-12-02 00:22:25 【问题描述】:

我有一个 JSF 1.2 登录页面 (login.xhtml),它有 2 个子表单 - menuForm、loginForm。

使用浏览器,我可以通过单击 loginForm 中的 Login 按钮从登录页面导航到 productList.xhtml 页面。

……

为了允许 Google Crawler 抓取我需要登录的页面,我正在尝试在 loginForm 上使用 Java 程序测试表单提交,以查看是否可以检索 productList.xhtml 页面。

login.xhtml 页面中的隐藏字段(从浏览器查看源代码)包括以下内容: 用户名 密码 自动滚屏 登录表格 登录按钮 javax.faces.ViewState

我已经在我的 Java 程序中提交了上面的所有值(javax.faces.ViewState 除外),但在我的回复中一直只返回 login.xhtml 页面。为什么是这样?

我无法提交 javax.faces.ViewState,因为当从 Java 程序提交时,表单的服务器端没有状态。如何提交还没有视图状态的表单?

【问题讨论】:

【参考方案1】:

允许 Google 爬虫抓取我需要登录的页面

登录需要一个会话(基本上:一个 cookie)。但是网络爬虫不维护会话(基本上:他们不维护cookie)。所以就到这里了。您必须删除登录表单并将所有导航命令链接替换为普通链接才能让任何网络爬虫索引您的页面。

您为什么想让受限页面可抓取(因此:公开可用),这超出了我的理解。为什么第一次登录在那里?


我已经在我的 Java 程序中提交了上面的所有值(javax.faces.ViewState 除外),但在我的回复中一直只返回 login.xhtml 页面。这是为什么呢?

因为您省略了视图状态字段。 JSF 将不会处理表单提交。一方面是为了防止 CSRF 攻击,另一方面是因为 JSF 是一个基于有状态组件的 MVC 框架。


我无法提交 javax.faces.ViewState,因为当从 Java 程序提交时,表单的服务器端没有状态。如何提交还没有视图状态的表单?

您需要维护会话(基本上:在后续请求中将所有cookie从服务器发回),或者将web.xml中的状态保存方法设置为client并且您还需要将视图状态隐藏字段与表单提交请求一起传递。

【讨论】:

允许 Google 抓取我的受限页面的主要原因是因为这似乎是自 2011 年 8 月 31 日以来 Adsense 的新方式。到目前为止,我的网站有大约 5600 个公共页面,每个用户可能有大约 200 个受限页面,但 Google Adsense 一直以“仅登录”为由拒绝我的申请。 嗯嗯。要么不要在这些页面上放置 Google 广告,要么制作这些页面的公共版本,但功能/权限/按钮/等有限,就像您在讨论论坛和问答网站上看到的那样。

以上是关于使用 Java 提交表单的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java 提交表单

使用Session防止表单重复提交

javaweb提交表单出现问号

Html中 from表单提交如何提交数组到java后台?

使用Session防止表单重复提交

java 模拟浏览器提交表单后获取新url