予想どおり、デフォルト構成(HTTP基本認証+ glassfish 3.1.2のファイルレルム)で次のコードを使用すると、クライアントは資格情報を要求されます。ただし、更新後、またはブラウザの新しいタブでさえ(Cookieが許可されておらず、パスワードが保存されていない場合でも)、クライアントは資格情報を再入力するように求められなくなります。のみ、ブラウザを閉じて再度開くと、クライアントは資格情報の入力を再度求められます。認証はどのようにそれを行っていますか?
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-statementsが再度追加されると(ブラウザーの再起動なしで)、それらが出力されます。println-Statementsを別のtry/catch--ブロックに移動しようとしましたが、違いはないようです。
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();
}
それは、認証がどのように機能しているか、そしてそれをどのように使用できるかについての質問に私を導きました。可能ですが、ブラウザからログインが発生すると、認証は記憶し、その情報をサーバーに保存します。おそらくそうではありません。
ところで、セッションを無効にしようとしました。ただし、新しいログインは必要ありません(これは、テストのためにクライアントブラウザでCookieを無効にした元の投稿に一致します)。