Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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 Spring security记住我工作不正常,数据库表工作不正常_Java_Spring Mvc_Spring Security_Remember Me - Fatal编程技术网

Java Spring security记住我工作不正常,数据库表工作不正常

Java Spring security记住我工作不正常,数据库表工作不正常,java,spring-mvc,spring-security,remember-me,Java,Spring Mvc,Spring Security,Remember Me,在设置SpringSecurityMemberMe(持久令牌方法)之后,用户的数据存储到数据库(“持久令牌”表)中。我可以在浏览器中看到“SPRING\u SECURITY\u Memory\u ME\u COOKIE”。重新启动服务器后,我刷新我的,同一个用户登录。但是,当同一用户再次登录时,他的数据应该更新。但是,它并没有被更新,而是被插入到数据库中。因此,一个用户在该表中有多个值。 我的applicationSecurity.xml是 <security:http auto-con

在设置SpringSecurityMemberMe(持久令牌方法)之后,用户的数据存储到数据库(“持久令牌”表)中。我可以在浏览器中看到“SPRING\u SECURITY\u Memory\u ME\u COOKIE”。重新启动服务器后,我刷新我的,同一个用户登录。但是,当同一用户再次登录时,他的数据应该更新。但是,它并没有被更新,而是被插入到数据库中。因此,一个用户在该表中有多个值。 我的applicationSecurity.xml是

 <security:http auto-config="true" use-expressions="true">
    <security:intercept-url pattern="/admin" access="hasRole('ADMINISTRATOR')" />
    <security:intercept-url pattern="/welcome" access="isAuthenticated()" />
    <security:remember-me
              token-validity-seconds = "1209600"
              data-source-ref = "dataSource"/>
</security:http>

<security:authentication-manager>
   <security:authentication-provider>
        <security:jdbc-user-service data-source-ref="dataSource"
 </security:authentication-provider>
</security:authentication-manager>
}

实现PersistentTokenRepository

 @Repository
 public class PersistentTokenRepositoryImpl implements PersistentTokenRepository{

@Autowired
private RememberMeTokenRepository rememberMeTokenRepository;

@Override
public void createNewToken(PersistentRememberMeToken token) {

    RememberMeToken newToken = new RememberMeToken(token);
    this.rememberMeTokenRepository.save(newToken);

}

@Override
public void updateToken(String series, String tokenValue, Date lastUsed) {


    RememberMeToken token = this.rememberMeTokenRepository.findBySeries(series);
    if(token != null)
    {
        token.setToken(tokenValue);
        token.setDate(lastUsed);
    }
}

@Override
public PersistentRememberMeToken getTokenForSeries(String series) {

    RememberMeToken token = this.rememberMeTokenRepository.findBySeries(series);
    return new PersistentRememberMeToken(token.getUsername(),token.getSeries(),token.getToken(),token.getDate());        
}

@Override
public void removeUserTokens(String userName) {
    Iterable<RememberMeToken> tokens = this.rememberMeTokenRepository.findByUserName(userName);
    this.rememberMeTokenRepository.delete(tokens);
}
@存储库
公共类PersistentTokenRepositoryImpl实现PersistentTokenRepository{
@自动连线
私有RememberMetakenRepository RememberMetakenRepository;
@凌驾
public void createNewToken(persistentermembermetoken令牌){
RememberMeToken newToken=新的RememberMeToken(令牌);
这个.rememberTokenRepository.save(newToken);
}
@凌驾
public void updateToken(字符串系列、字符串标记值、上次使用日期){
RememberMeToken-token=this.RememberMeToken-repository.findBySeries(系列);
if(令牌!=null)
{
token.setToken(tokenValue);
token.setDate(上次使用);
}
}
@凌驾
公共持久化EnterMemberMetoken GetToken信息系列(字符串系列){
RememberMeToken-token=this.RememberMeToken-repository.findBySeries(系列);
返回新的PersistEnterMemberMetoken(token.getUsername()、token.getSeries()、token.getToken()、token.getDate());
}
@凌驾
public void removeUserTokens(字符串用户名){
Iterable tokens=this.rememberMeTokenRepository.findByUserName(用户名);
this.rememberMeTokenRepository.delete(令牌);
}

}

我认为您没有提供用户名和令牌的唯一属性,这是一种确保仅插入唯一行的方法,或者如果值已更新,您还可以检查createNewToken()方法,如果电子邮件已插入,并且如果电子邮件不存在,则只有您可以插入该行,这样你就可以收到一行一封的电子邮件,希望这会对你有所帮助,谢谢

 @Repository
 public class PersistentTokenRepositoryImpl implements PersistentTokenRepository{

@Autowired
private RememberMeTokenRepository rememberMeTokenRepository;

@Override
public void createNewToken(PersistentRememberMeToken token) {

    RememberMeToken newToken = new RememberMeToken(token);
    this.rememberMeTokenRepository.save(newToken);

}

@Override
public void updateToken(String series, String tokenValue, Date lastUsed) {


    RememberMeToken token = this.rememberMeTokenRepository.findBySeries(series);
    if(token != null)
    {
        token.setToken(tokenValue);
        token.setDate(lastUsed);
    }
}

@Override
public PersistentRememberMeToken getTokenForSeries(String series) {

    RememberMeToken token = this.rememberMeTokenRepository.findBySeries(series);
    return new PersistentRememberMeToken(token.getUsername(),token.getSeries(),token.getToken(),token.getDate());        
}

@Override
public void removeUserTokens(String userName) {
    Iterable<RememberMeToken> tokens = this.rememberMeTokenRepository.findByUserName(userName);
    this.rememberMeTokenRepository.delete(tokens);
}