Java HttpServletRequest.authenticate不要求重新登录
按照预期使用以下代码和默认配置(glassfish 3.1.2中的HTTP基本身份验证+文件域),客户端将被要求提供凭据。但是,在刷新后,甚至在浏览器中的新选项卡上(即使不允许cookies,也不存储密码),客户端不再被要求重新输入凭据。只有当浏览器关闭并重新打开时,才会再次要求客户端提供凭据。你是怎么做到的Java HttpServletRequest.authenticate不要求重新登录,java,servlet-3.0,Java,Servlet 3.0,按照预期使用以下代码和默认配置(glassfish 3.1.2中的HTTP基本身份验证+文件域),客户端将被要求提供凭据。但是,在刷新后,甚至在浏览器中的新选项卡上(即使不允许cookies,也不存储密码),客户端不再被要求重新输入凭据。只有当浏览器关闭并重新打开时,才会再次要求客户端提供凭据。你是怎么做到的 public class AuthenticateServlet extends HttpServlet { protected void processRequest(Http
public class AuthenticateServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
request.authenticate(response);
out.println("Authenticate Successful");
} finally {
request.logout();
out.close();
}
}
[...]
}
问候,
迈克
-编辑-
这个问题是在试验使用编程安全性的方法时提出的。在重新启动的客户端浏览器中使用以下代码时,第一条println语句会引发NPE。登录窗口甚至不会出现在客户端浏览器中。然而,当println-语句被删除时,登录窗口确实会出现,并且登录工作正常。然后再次添加println语句(并且不重新启动浏览器)时,将打印它们。我还试图将println语句移动到另一个try/catch-block中,但这似乎没有什么不同
try {
request.authenticate(response);
out.println("<p>Principal's name: " + request.getUserPrincipal().getName() + "</p>"); <== NPE
out.println("<p>is that user in role 'gruppeA': " + request.isUserInRole("a_gruppe") + "</p>");
out.println("<p>remote User is: " + request.getRemoteUser() + "</p>");
out.println("Authenticate Successful");
} catch (ServletException ex) {
out.println("Login Failed with a ServletException." + ex.getMessage());
return;
} finally {
out.close();
}
试试看{
请求、认证(响应);
out.println(“主体的名称:“+request.getUserPrincipal().getName()+””);身份验证凭据被缓存在某个地方,看起来它是基于会话的。
您可以在服务器中检查清除会话的方法,但也可以在/clear处绑定一些servlet并调用request.getSession().invalidate()
我认为缓存凭证是相当标准的,有时浏览器也会这样做,您的特定用例是什么