j_security_check <Context path=""> 时不工作

j_security_check not working when <Context path="">

我在 tomcat/tomEE 服务器上使用 j_security_check 作为 JAAS 机制的一部分。

我目前有一个名为 "admin" 的上下文,它将登录过程作为一个单独的页面 (login.html),并且该登录页面的形式类似于:<form action="j_security_check" method="post">使用适当的输入发送 j_username & j_password 属性。

那里一切正常。

需要说明的是,我的应用程序可以在例如"www.myapp.com/admin"

现在我被要求在域的根目录中添加另一个 webapp,"www.myapp.com",所以我将其添加到我的 conf/server.xml:

`<Context 
  docBase="ROOT" 
  path="" 
  reloadable="true" 
/>`

ROOT.war 包含需要在 www.myapp.com/ 域路径中的 webapp。

我想做的是将 j_security_check 机制也添加到该上下文中(出于用户体验原因,应该在 AJAX 而不是 <form> 中完成)。

请注意,我已经设法在两种情况下都有 cookie,但是当我进行 www.myapp.com/j_security_check 调用时,我总是会收到 408 Request Timeout 响应。

如何从我的应用程序的根上下文路径执行 j_security_check 调用? (请不要使用外部登录页面)

问题是您没有遵循基于 FORM 的身份验证规则:您需要首先请求受保护的资源,然后让容器向您询问用户名和密码。身份验证成功后,容器会将您重定向到最初请求的资源。 Java Servlet Specification Version 3.0 的第 13.6.3 节对此进行了介绍。如果您想处理路过式登录,您需要自己来做。 Servlet 3.0 在 HttpServletRequest 对象上有 login 方法,您只需将 AJAX 请求提交到您自己的 servlet 而不是 j_security_check.

请注意,您 server.xml 中的 <Context> 配置将导致无休止的混乱,并且会在同一台服务器上部署您的 ROOT Web 应用程序两次。只需将 ROOT.war 放入 Tomcat 的 webapps/ 目录并让它自动部署。