Java spring security记得我什么时候处理cookie?

Java spring security记得我什么时候处理cookie?,java,cookies,spring-security,remember-me,Java,Cookies,Spring Security,Remember Me,Spring security 3.1.1 所以我做了一个定制的记忆我服务,它扩展了默认的基于令牌的记忆我服务,只是为了检查它是否被调用 import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.security.core.Authentication; import org.springframework.secu

Spring security 3.1.1

所以我做了一个定制的记忆我服务,它扩展了默认的基于令牌的记忆我服务,只是为了检查它是否被调用

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices;

public class CustomTokenBasedRememberMeService extends TokenBasedRememberMeServices {

    @Override
    protected int calculateLoginLifetime(HttpServletRequest request, Authentication authentication) {
        System.out.println("COOKIE: Process1!");
        return super.calculateLoginLifetime(request, authentication);
    }

    @Override
    protected boolean isTokenExpired(long tokenExpiryTime) {
        System.out.println("COOKIE: Process2!");
        return super.isTokenExpired(tokenExpiryTime);
    }

    @Override
    protected String makeTokenSignature(long tokenExpiryTime, String username, String password) {
        System.out.println("COOKIE: Process3!");
        return super.makeTokenSignature(tokenExpiryTime, username, password);
    }

    @Override
    protected String retrievePassword(Authentication authentication) {
        System.out.println("COOKIE: Process4!");
        return super.retrievePassword(authentication);
    }

    @Override
    protected String retrieveUserName(Authentication authentication) {
        System.out.println("COOKIE: Process5!");
        return super.retrieveUserName(authentication);
    }

    @Override
    protected UserDetails processAutoLoginCookie(String[] cookieTokens, HttpServletRequest request, HttpServletResponse response) {
        System.out.println("COOKIE: Process6!");
        return super.processAutoLoginCookie(cookieTokens, request, response);
    }    

    @Override
    public void onLoginSuccess(HttpServletRequest request, HttpServletResponse response, Authentication successfulAuthentication) {
        System.out.println("COOKIE: Process7!");
        super.onLoginSuccess(request, response, successfulAuthentication);
    }
}
当我登录时,它会打印出:

INFO: COOKIE: Process7!
INFO: COOKIE: Process5!
INFO: COOKIE: Process4!
INFO: COOKIE: Process1!
INFO: COOKIE: Process3!
这意味着它调用onloginsucess()、retrieveUserName()、retrievePassword()、calculateLoginLifetime()和makeTokenSignature()

浏览器已接受cookie,但从未对其进行过处理。即使在我删除会话、重新启动浏览器等之后,它也从未被处理过,我认为processAutoLoginCookie对此负责,但它也从未被调用过


spring security处理cookie的条件是什么?

在您的案例中,您使用的是TokenBasedMemberMeservices。处理发生在父级中的AbstractMemberServices中。它发生在其autoLogin()方法上


此方法由RememberMeAuthenticationFilter.doFilter()调用。筛选器将MemberServices保留为成员,并调用其autoLogin()。因此,无论您是使用PersistentTokenBasedMemberMeservices还是使用TokenBasedMemberMeservices,Cookie处理都是相同的,并由父级处理。

在您的情况下,您使用的是TokenBasedMemberMeservices。处理发生在父级中的AbstractMemberServices中。它发生在其autoLogin()方法上


此方法由RememberMeAuthenticationFilter.doFilter()调用。筛选器将MemberServices保留为成员,并调用其autoLogin()。因此,无论您是使用PersistentTokenBasedMemberMeservices还是使用TokenBasedMemberMeservices,Cookie处理都是相同的,由父级处理。

我可以看出,如果SecurityContextHolder.getContext().getAuthentication()==null,那么它调用autoLogin()方法,我无法覆盖autoLogin()因为它被宣布为最终版本。所以我相信它工作得很好,并且我注意到它随后调用了processAutoLoginCookie()方法。但该方法从未被调用。因此,我假定身份验证永远不会为null,或者doFilter()方法从一开始就不会被调用。您对此有何看法?首先,您可以轻松调试Spring的代码。然后,您将能够看到流程和发生的情况。其次,如果您将日志放在“debug”中,您将看到Spring日志(它们在autoLogin()中有一个)。这样,您就可以知道是否调用了autoLogin()。请注意,可以调用autoLogin(),但如果找不到Cookie,它将返回null,因此不会调用“processAutoLoginCookie()”。如果有帮助,请随时将我的答案标记为好答案:-)processAutoLoginCookie方法何时调用?描述复制自类:AbstractMemberServices:从autoLogin调用以处理提交的持久登录cookie。子类应该验证cookie并执行所需的任何附加管理。我已经实现了基于令牌的记住我。在其中一个博客中,我读到,一旦会话超时,就会调用RememberMe。我有两个问题。1) 是否应在“记住我”中再次设置cookie令牌有效时间?2) 如果我从其他页面(即非登录页面)刷新,是否会调用RememberMe方法或auto login?我可以看到,如果SecurityContextHolder.getContext().getAuthentication()==null,那么它将调用autoLogin()方法,我无法重写autoLogin(),因为它已声明为final。所以我相信它工作得很好,并且我注意到它随后调用了processAutoLoginCookie()方法。但该方法从未被调用。因此,我假定身份验证永远不会为null,或者doFilter()方法从一开始就不会被调用。您对此有何看法?首先,您可以轻松调试Spring的代码。然后,您将能够看到流程和发生的情况。其次,如果您将日志放在“debug”中,您将看到Spring日志(它们在autoLogin()中有一个)。这样,您就可以知道是否调用了autoLogin()。请注意,可以调用autoLogin(),但如果找不到Cookie,它将返回null,因此不会调用“processAutoLoginCookie()”。如果有帮助,请随时将我的答案标记为好答案:-)processAutoLoginCookie方法何时调用?描述复制自类:AbstractMemberServices:从autoLogin调用以处理提交的持久登录cookie。子类应该验证cookie并执行所需的任何附加管理。我已经实现了基于令牌的记住我。在其中一个博客中,我读到,一旦会话超时,就会调用RememberMe。我有两个问题。1) 是否应在“记住我”中再次设置cookie令牌有效时间?2) 如果我从其他页面(即非登录页面)刷新,是否会调用RememberMe方法或自动登录?