我已经完成了留言簿教程,并且一直在尝试对/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。
任何帮助将不胜感激!
最佳答案
我想你问题的核心是,当用户被重定向到Google登录页面时,Google并没有真正使用POST将它们返回到你的应用程序,我认为它只是一个GET,所以总而言之,我怀疑Google登录是否会保留你原来的POST签名,并在用户通过身份验证后将其重放回你的应用程序。因此,您可以采取的一种方法是,如果用户未登录,则隐藏签名表单,然后显示一条消息,要求他们单击登录链接。例如,在 guestbook.jsp 上的第 80 行:
<%
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 前面使用过滤器,记住用户在 session 中的原始请求,制定登录 URL,将用户重定向到它,一旦用户回来处理他们的原始请求,但这很复杂,所以在你的情况下,你最好明确要求用户首先进行身份验证
关于java - GAE 留言板 Java 教程。强制验证/签署 servlet 会导致重定向出现 405,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26246364/