こんにちは、HttpSession にユーザー pojo を保存し、セッションが完了したときにその HttpSession オブジェクトを無効にすることによって、ユーザーが認証するための独自の実装を使用するアプリケーションがありますが、私がやりたいことは、セキュリティ コンテキストを使用してユーザーを認証することです。 . 私がサーブレット AuthenticateUserServlet を持っているとしましょう:
public void doPost(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
String username=req.getParameter("username");
String password=req.getParameter("password");
if(Authenticator.check(username,password)){
HttpSession session=req.getSession(true);
session.setAttribute("user",Authenticator.getUser(username));
PrintWriter out= req.getWriter();
out.println("<h2>Welcome</h2>");
}else{
PrintWriter out= req.getWriter();
out.println("<h2>the password or username are incorrect</h2>");
}
}
上記のコードではセキュリティ コンテキストの力が得られないため、ユーザーがログインしても問題ないことを確認するときに、このユーザーがここでアクセスできるセキュリティ コンテキストを何らかの方法で伝えたいとは思いません。 AuthenticateUserServlet:
public void doPost(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
String username=req.getParameter("username");
String password=req.getParameter("password");
LoginContext lc = new LoginContext("my-jaas",new MyCallbackHandler(username,password));
try{
lc.login();
//notice i have not save any thing in the HTTPSeession
//i want my container to remember this user like what happens in the
// form based authentication where nothing gets saved in the httpSession
// but the user keeps logged in(cartalina uses a session object not httpsession for that)
PrintWriter out= req.getWriter();
out.println("<h2>Welcome</h2>");
}
catch(LoginException e ){
PrintWriter out= req.getWriter();
out.println(e.getMessage());
}
}
独自の LoginModule (「my-jaas」) を作成しましたが、Tomcat7 で Form-Based 認証を構成すると正常に動作します。