Java 调用request.getSession(true)是否明确需要通过request.login(用户名、密码)持久化编程身份验证?

Java 调用request.getSession(true)是否明确需要通过request.login(用户名、密码)持久化编程身份验证?,java,authentication,servlets,servlet-filters,Java,Authentication,Servlets,Servlet Filters,在使用JavaServlet过滤器与内部SSO集成时,我努力找到使用编程安全功能创建持久登录的正确方法。具体来说,在阅读了许多教程(如我调用request.loginusername、password和用户主体)后,创建了一个用户主体,它为当前请求的request.IsUserInRole等方法返回正确的值 我希望这对用户来说是持久的,但后续请求将为request.getUserPrincipal返回null,因此在每个请求中都输入了我的身份验证代码。经过多次搜索,我发现在调用request.l

在使用JavaServlet过滤器与内部SSO集成时,我努力找到使用编程安全功能创建持久登录的正确方法。具体来说,在阅读了许多教程(如我调用request.loginusername、password和用户主体)后,创建了一个用户主体,它为当前请求的request.IsUserInRole等方法返回正确的值

我希望这对用户来说是持久的,但后续请求将为request.getUserPrincipal返回null,因此在每个请求中都输入了我的身份验证代码。经过多次搜索,我发现在调用request.loginusername之前调用request.getsessionrue,密码会导致主体对用户会话保持持久性

是否需要在用户登录之前显式创建会话以持久化会话的主体?这种行为对我来说似乎很奇怪,所以我想知道我是否做错了什么。我很欣赏比我更了解这个问题的开发人员的见解。使用JDK7和Tomcat8。Realm是RealmBase的扩展,它覆盖authenticateusername、password、getName、getPasswordusername和getPrincipalusername

public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc) throws IOException, ServletException {
    HttpServletRequest  request  = (HttpServletRequest)req;
    HttpServletResponse response = (HttpServletResponse)res;

    if(request.getUserPrincipal() == null) {
        try {
            String userName = request.getParameter(userNameField);
            String password = request.getParameter(passwordField);

            request.getSession(true); // <-- block always entered without this

            request.login(username,password);
         }
         catch(ServletException e) {
             // Handle failed login...
             return;
         }
    }

    fc.doFilter(req,res);
}

答案在AuthenticatorBase.java的Tomcat源代码中,其中loginusername、密码链接调用配置域的authenticateusername、password方法,然后调用register。。。传递返回的主体并将其存储在会话中(如果存在)

需要首先创建会话,因为主体放在那里。你可以说明request.login应该为你做到这一点,但显然不行。谢谢。这才是问题的根源。我觉得奇怪的是,如果会话存在,它会自动将其存储在那里。我最初将这两行代码颠倒过来,我在登录后立即创建会话,这与根本不创建会话是一样的。我可能应该看看RealmBase代码。。。