我编写了一个 HTML 5 应用程序,它使用 AngularJS 并与运行在 Tomcat 上的 Java REST 后端接口。我使用 Spring Security 来处理登录和安全性。
当用户进入网站时,他被转发到一个登录页面,该页面创建一个会话并重定向到索引页面。从服务器加载更多数据的 REST 调用然后使用该会话进行身份验证。如果没有会话,我会回退到基于 HTTP 的基本身份验证,这样就可以独立于 Web 应用程序调用 REST 端点。
我现在遇到的问题是会话何时到期。这会导致HTTP 401 Unauthenticated
来自服务器的响应。我以为我可以捕捉到该错误并使用 Javascript 将用户重定向回登录页面。但是,在调用我的错误处理程序之前,浏览器首先会显示一个登录窗口,只有当我单击取消我的 Javascript 错误处理程序才能处理响应。
我的问题是,有没有办法阻止浏览器显示这个登录窗口?或者这是我的应用程序设计的普遍问题?
另一种方法可能是根本不使用会话并在应用程序中缓存用户名和密码。然后我需要使用基本身份验证在每个 REST 调用中发送它,这会是更好的方法吗?
以下是来自服务器的 HTTP 响应:
HTTP/1.1 401 Unauthorized
Server: Apache-Coyote/1.1
WWW-Authenticate: Basic realm="Spring Security Application"
Content-Type: text/html;charset=utf-8
Content-Length: 999
Date: Mon, 30 Sep 2013 11:00:34 GMT
更新:看起来这是WWW-Authenticate
标题的原因,它导致浏览器显示登录对话框。