Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Postlogin钩子是一种使用servlet、过滤器的功能_Java_Servlets_Web Applications_Servlet Filters - Fatal编程技术网

Java Postlogin钩子是一种使用servlet、过滤器的功能

Java Postlogin钩子是一种使用servlet、过滤器的功能,java,servlets,web-applications,servlet-filters,Java,Servlets,Web Applications,Servlet Filters,我在我的webApp中有一个要求,我需要为使用有效凭据登录的用户生成内部密码。也就是说,此内部密码生成功能将在用户的会话生存期内仅发生一次。我需要将此内部密码放入用户的会话中。 使用postlogin钩子可以在liferay中实现类似的功能,但我不知道如何仅使用servlet和过滤器来实现同样的功能。 注意:我使用JAAS进行用户身份验证 我做了如下操作:在servlet过滤器中,检查会话中的内部密码,如果它不存在,则生成。但在用户登录后,同时有多个对服务器的请求,则会创建不必要的多个密码。这个

我在我的webApp中有一个要求,我需要为使用有效凭据登录的用户生成内部密码。也就是说,此内部密码生成功能将在用户的会话生存期内仅发生一次。我需要将此内部密码放入用户的会话中。 使用postlogin钩子可以在liferay中实现类似的功能,但我不知道如何仅使用servlet和过滤器来实现同样的功能。 注意:我使用JAAS进行用户身份验证

我做了如下操作:在servlet过滤器中,检查会话中的内部密码,如果它不存在,则生成。但在用户登录后,同时有多个对服务器的请求,则会创建不必要的多个密码。这个密码生成是一件昂贵的事情

有人能给我提点别的建议吗?
提前谢谢。

我不知道JAAS身份验证是如何工作的,我只是指那部分:

我需要将此内部密码放入用户会话

如果您想将任何内容存储到用户会话以供以后处理,可以在serlvets代码中执行此操作

protected final void doGet(HttpServletRequest request,HttpServletResponse response) {
   HttpSession session = request.getSession(true); //this returns an existing session, or creates new one
   session.setAttribute(key,value);
... 
}
只要会话存在,这些存储的对象就一直可用

我做了如下操作:在servlet过滤器中,检查会话中的内部密码,如果它不存在,则生成。但在用户登录后,同时有多个对服务器的请求,则会创建不必要的多个密码。这个密码生成是一件昂贵的事情

如果生成内部密码的成本很高,则不应在servlet过滤类中创建它们,因为这些过滤器适用于客户机向服务器发出的任何请求。将pw生成的相关代码移动到servlet,它执行用户凭证的实际验证。如果凭据正常,请创建一次密码并将其存储在会话对象中,如上所述

更新: 假设你有某种html表单

<form method="post" action="AuthServlet">
  <input type="text" name="username">
  <input type="password" name="pwd">
  <input type="submit" value="login">
</form>
在用
ServletName
表示的servlet中,您可以在
doPost()中执行密码生成,并将此pwd附加到用户会话。
如果您有某种用户模型,并且用户具有角色等。您可以查询角色,并根据角色转发到servlet。

这更有帮助吗

在验证用户时添加内部密码生成逻辑就可以了。因此,我需要在JAAS身份验证模块中添加此逻辑。但是,我的问题是针对纯servlet的。但我的问题是:有没有办法像web.xml中的任何配置一样,在登录后只调用一次servlet。请不要说明如何将值设置到会话中。我认为,从我的问题可以清楚地看出,我曾经使用过servlet,并且对服务器端技术有基本的了解。但是谢谢你的回答。我已经更新了我的答案,我不得不承认,也许我没有正确地理解你,看我上面的假设这似乎是正确的。非常感谢你的朋友。
@WebServlet("/AuthServlet")
public class AuthServlet 
    extends HttpServlet {
//  .. lines omitted ..

   @Override
   protected final void doPost(HttpServletRequest request,
           HttpServletResponse response) throws ServletException,IOException {

      // ... lines omitted 

      // perform authentication with JAAS
      try {
         LoginContext loginContext = new LoginContext("SomeName", handler);
         // starts the actual login
         loginContext.login();

         //at this point, user is authenticated..normally you would forward him to e.g. a jsp, welcoming the user
         //request.getRequestDispatcher("anyJsp.jsp").forward(request, response);

         //but you can also forward to another serlvet and perform business logic or else
         request.getRequestDispatcher("/ServletName").forward(request, response); 

      } catch (LoginException e) {
         //do sth., if auth fails
      }
 }