GAE留言簿Java教程。强制认证/ sign servlet导致重定向405

时间:2014-10-07 22:31:21

标签: java google-app-engine servlets post

我已经阅读了留言簿教程,并且我一直在尝试强制对/ 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。

非常感谢任何帮助!

1 个答案:

答案 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,将用户重定向到它,一次用户回来处理他们的原始请求,但这很复杂,所以在你的情况下你最好明确地要求用户首先进行身份验证