@Transient注释,@org.springframework.data.annotation.Transient注释,transient关键字和密码存储

10 浏览
0 Comments

@Transient注释,@org.springframework.data.annotation.Transient注释,transient关键字和密码存储

我目前正在学习Spring框架,主要关注其安全模块。我观看了一些关于注册和登录的指南。我看到在User类的密码字段上使用了transient关键字或@Transient注解。\n我的虚拟应用程序使用了Spring Boot + Spring MVC + Spring Security + MySQL。\n我知道:\nJava的transient关键字用于表示字段不需要被序列化。\nJPA的@Transient注解指定属性或字段不持久化。它用于注释实体类、映射超类或可嵌入类的属性或字段。\norg.springframework.data.annotation的@Transient注解。\n标记字段对于映射框架来说是瞬态的。因此,该属性不会被持久化,也不会被映射框架进一步检查。\n在我的MySQL数据库中,我有一个名为spring_demo的模式,其中包含3个表:\nrole\nuser\nuser_role\n当我在User类的密码字段上使用transient关键字时,它不会存储在MySQL数据库中。(例如:test01)\n当我在User类的密码字段上使用javax.persistence @Transient注解时,它也不会存储在MySQL数据库中。(例如:test02)\n但是...当我在User类的密码字段上使用org.springframework.data.annotation @Transient注解时,它会存储在MySQL数据库中。(例如:test03)为什么会这样?\n我的主要问题是,当我使用基于spring.data的@Transient注解时,密码字段已经被持久化了。为什么?为什么我应该在密码字段上使用任何@Transient注解?\n提前感谢您的指导和帮助!

0
0 Comments

在Spring框架中,可以使用映射框架将一个形式转换为另一个形式。例如,假设您的Spring Java服务器端应用程序需要将用户信息以JSON格式发送给客户端(网页、移动应用程序)。

public class User {
    private long id;
    @JsonProperty("username")
    private String username;
    @JsonProperty("email")
    private String email;
    @JsonProperty("password")
    private String password;
}

要将这个Java实体对象映射为JSON格式,可以使用映射框架(例如jackson:com.fasterxml.jackson.databind.ObjectMapper)或手动操作。将用户2对象转换为JSON时,得到的JSON格式输出如下:

{

"id": 2,

"email": "test03.com",

"username": "test03",

"password": "$2a$10$UbvmdhfcKxSNr/I4CjOLtOkKGX/j4/xQfFrv3FizxwEVk6D9sAoO"

}

如果在代码中添加了以下内容:

@org.springframework.data.annotation.Transient
@JsonProperty("password")
private String password;

然后再次使用映射框架生成用户2实体的JSON,将得到以下结果:

{

"id": 2,

"email": "test03.com",

"username": "test03"

}

请注意,JSON输出中缺少密码字段。这是因为.springframework.data.annotation.Transient明确告诉Spring框架,在从Java对象转换为JSON时,使用的对象映射器不应包含此值。

还要注意,如果尝试将上述实体持久化到数据库中,它仍然会保存到数据库中,因为.springframework.data.annotation.Transient仅适用于对象映射框架,而不适用于JPA。

总结一下:

* transient关键字适用于所有序列化操作(通过网络传输、保存到磁盘、保存到数据库)。

* javax.persistence.Transient注解专门用于JPA数据库序列化。

* .springframework.data.annotation.Transient注解用于Spring内部使用的对象映射框架序列化。

如果不希望在保存对象时忽略该字段,可以使用private transient String password。

我目前正在学习Spring和Spring Security,这个答案非常详细和清晰,对于解决我的密码字段未保存到数据库的问题非常有帮助。非常感谢!

0