我已经阅读了留言簿教程,并且我一直在尝试强制对/ sign servlet进行身份验证。这是我在web.xml中的内容
<servlet>
<servlet-name>sign</servlet-name>
<servlet-class>com.google.appengine.demos.guestbook.SignGuestbookServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sign</servlet-name>
<url-pattern>/sign</url-pattern>
</servlet-mapping>
<security-constraint>
<web-resource-collection>
<web-resource-name>sign</web-resource-name>
<url-pattern>/sign/*</url-pattern>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
</security-constraint>
尝试签署留言簿时,我会被正确地重定向到登录界面,但是一旦我点击“登录”,我就会收到以下错误
Error 405 HTTP method GET is not supported by this URL
所以看起来重定向是GET而不是POST。
非常感谢任何帮助!
答案 0 :(得分:1)
我想你的问题的核心是,当用户被重定向到Google登录页面时,Google并没有真正使用POST将它们交还给您的应用程序,我认为它只是一个GET,所以总而言之,我怀疑Google登录将保留您的原始POST签名,并在用户通过身份验证后将其重播回您的应用程序。因此,您可以采用的一种方法是,如果用户未登录,则隐藏符号表单,然后显示一条消息,要求他们单击登录链接。例如,来自第80行的guestbook.jsp:
<%
if (user != null) {
%>
<form action="/sign" method="post">
<div><textarea name="content" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="Post Greeting"/></div>
<input type="hidden" name="guestbookName" value="${fn:escapeXml(guestbookName)}"/>
</form>
<%
} else {
%>
<span>Please login first to be able to sign the guestbook (click the login link above)</span>
<%
}
%>
顺便说一下,我没有对此进行测试。
我过去必须使用的其他更多参与选项是在servlet前面使用过滤器,记住用户在会话中的原始请求,制定登录URL,将用户重定向到它,一次用户回来处理他们的原始请求,但这很复杂,所以在你的情况下你最好明确地要求用户首先进行身份验证