表单使用Java提交

时间:2011-10-06 06:07:17

标签: java forms jsf submit viewstate

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

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

....

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

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

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

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

1 个答案:

答案 0 :(得分:1)

  

允许Google Crawler抓取我需要登录的网页

登录需要一个会话(基本上是一个cookie)。但是网页抓取工具不会维护会话(基本上:它们不维护cookie)。所以它最终到了这里。您必须删除登录表单并用普通链接替换所有导航命令链接,以便让任何webcrawler为您的页面编制索引。

除此之外,为什么您希望限制页面可以抓取(因此:公开可用)。为什么首先登录?


  

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

因为您省略了视图状态字段。 JSF将不会处理表单提交。对于一部分而言,这是对CSRF攻击的保护,对于其他部分,这是因为JSF是基于状态组件的MVC框架。


  

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

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