这不是经常发生。你遇到一个问题,挣扎了几天,最后把它发布到 StackOverflow(或任何地方),然后你相对容易地解决了这个问题。
我对我的应用程序进行了一些更改以解决问题。我正在发布我所做的事情,以防有人偶然从谷歌遇到类似问题。
首先,我创建了一个 servlet(称为 EndSessionServlet),它就是这样做的:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
endSession(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
endSession(request, response);
}
private void endSession(HttpServletRequest request, HttpServletResponse response) throws IOException{
request.getSession().invalidate();
response.sendRedirect(".");
}
然后我将它添加到我的 web.xml 文件中:
<error-page>
<error-code>403</error-code>
<location>/EndSessionServlet</location>
</error-page>
我还更改了 web.xml 中的表单错误页面:
<login-config>
<auth-method>FORM</auth-method>
<realm-name>This is not used for FORM login</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/EndSessionServlet</form-error-page>
</form-login-config>
</login-config>
我在已通过 EndSessionServlet 验证的网页部分添加了一个链接。因此,经过身份验证的用户现在可以正确注销。
对于三种场景:
- 用户能够正常登录,用户单击 EndSessionServlet 的链接注销
- 用户为 ldap 输入了有效的用户名/密码,但不在正确的组中。该用户被正常发送到 403 页面,现在会话无效,并重定向到登录页面。
- 用户输入了无效的用户名/密码并被发送到也设置为 EndSessionServlet 的。这将结束会话,并将它们重定向到登录页面。
所以现在所有的场景都可以正常工作。