我有一个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程序提交时,表单的服务器端没有状态。如何提交尚未查看状态的表单?
答案 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
和您还需要传递视图状态隐藏字段以及表单提交请求。