我正在为前端开发AngularJS应用程序,为后端开发JavaEE应用程序。在我的AngularJS应用程序中,我尝试访问后端提供的REST资源。该资源受JAAS保护,因此只有经过身份验证的用户才能访问该资源。
在我的AngularJS应用程序中:
$http.get('/webresources/project/').success(function(data){...}).error(function(){...});
项目资源由我的web.xml文件保护:
...
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>file</realm-name>
</login-config>
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<url-pattern>/webresources/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
...
问题是,当我在未通过身份验证的情况下尝试访问此资源时,浏览器会显示登录提示,并且我的请求处于挂起状态,直到我单击取消,然后响应为401,带有WWW-Authenticate标头。
我想要的是,我可以摆脱这种浏览器登录提示,并显示我自己的登录表单。所以我找到了一些解决方案,但我不知道如何实现它们:
1-对后端说不发送WWW-Authenticate标头。如何在Java中做到这一点
2-发送另一个状态代码,而不是401。这是一种正确的行为吗?如果是:怎么做?
谢谢你的帮助。
你可以做一个简单的技巧:
创建一个401.jsp错误页面,并将其添加到web.xml中;在它做:
<%
response.reset();
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
%>
由于重置,这将删除WWW-Authenticate标头,但仍服务于401状态。
希望它能帮助