j_security_check被直接调用

5
我有一个网络应用程序,我希望主页包括一个登录表单,以及其他数据。如果用户选择登录,他应该被重定向到另一个页面(例如login_success.jsp)。我的问题是:我能否使用j_security_check机制进行登录,或者唯一的方法是使用托管bean来处理登录?
我的主页看起来像这样:
....
    <form action="j_security_check" method="POST" name="loginForm">
        <h:panelGrid columns="2">
            <h:outputLabel id="userNameLabel" for="j_username" value="#{label.home_username}:" />
            <h:inputText id="j_username" autocomplete="off" />
            <h:outputLabel id="passwordLabel" for="j_password" value="#{label.home_password}:" />
            <h:inputSecret id="j_password" autocomplete="off" />

            <h:panelGroup>
                <h:commandButton type="submit" value="Login" />
                <h:commandButton type="reset" value="Clear" />
            </h:panelGroup>
        </h:panelGrid>
    </form>
...

如果我按下登录按钮,会出现“HTTP状态400 - 无效的直接引用表单登录页面”的提示。很明显,j_security_check机制不知道要“重定向”到哪里,因为我之前没有请求受保护的资源。

抱歉:实际上有两个链接,由逗号分隔。但不知何故,它们被呈现为单个链接。在这里:https://dev59.com/8XE95IYBdhLWcg3wrP0o。 - kolossus
1个回答

9
HTTP状态码400 - 无效的直接引用表单登录页。
这意味着您在不允许的情况下通过直接请求手动打开了<form-login-page>
“很明显,j_security_check机制不知道要‘重定向’到哪里,因为我之前没有请求受保护的资源。”这并不是错误信息想要告诉你的内容。
“这不是错误信息试图告诉你的内容。”
将登录页面放在/WEB-INF文件夹中,以防止可能的直接访问。然后,要触发登录,只需直接请求受限资源。如果必要,容器会自动呈现登录页面。
或者,如果您没有仅限于受限资源(即登录仅显示更多选项/功能,例如在讨论论坛中),则不要使用<form-login-page>,而是使用带有后备bean的JSF表单,该bean调用HttpServletRequest#login()
另请参见:

2
但是,如果表单页面是我的主页,并且该表单包含在表单页面中,我无法将其放入/WEB-INF以防止可能的直接访问,我希望能够直接访问。 - Cattani Simone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接