首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@瞬态注释、@org.springframework.data.annotation.Transient注释、瞬态关键字和密码存储

问@瞬态注释、@org.springframework.data.annotation.Transient注释、瞬态关键字和密码存储
EN

Stack Overflow用户
提问于 2017-03-12 17:51:12
回答 1查看 41.8K关注 0票数 27

目前我正在学习Spring框架,主要关注它的安全模块。我看过一些与注册和登录有关的指南。我看到了瞬态关键字或@瞬态注释在用户类的密码字段中的常见用法。

我的虚拟应用程序使用Spring + Spring + Security + MySQL。

我知道

Java的瞬态关键字用于表示字段不被序列化。

JPA的@瞬态注释..。

...specifies表示属性或字段不是持久的。它用于注释实体类、映射超类或可嵌入类的属性或字段。

以及org.SpringFrawork.data.注释的@瞬态注释.。

将映射框架的字段标记为瞬态字段。因此,属性不会被持久化,也不会被映射框架进一步检查。

在我的MySQL db中,我有我的spring_demo模式,它有3个表:

代码语言:javascript
复制
+-----------------------+
| Tables_in_spring_demo |
+-----------------------+
| role                  |
| user                  |
| user_role             |
+-----------------------+

当我在用户类中的密码字段上使用瞬态关键字时,它不会存储在MySQL db中。(例子: test01)

代码语言:javascript
复制
mysql> select * from user;
+----+--------+------------------+----------+
| id | active | email            | username |
+----+--------+------------------+----------+
|  1 |      1 | test01@gmail.com | test01   |
+----+--------+------------------+----------+
1 row in set (0,00 sec)

当我在用户类中的密码字段上使用javax.persistence @瞬态注释时,它也不会存储在MySQL db中。(例子: test02)

但是..。当我在用户类中的密码字段上使用org.springframework.data.annotation @瞬态注释时,它会存储在MySQL db中。(例如: test03) 为什么?

代码语言:javascript
复制
mysql> select * from user;
+----+--------+------------------+----------+--------------------------------------------------------------+
| id | active | email            | username | password                                                     |
+----+--------+------------------+----------+--------------------------------------------------------------+
|  1 |      1 | test02@gmail.com | test02   |                                                              |
|  2 |      1 | test03@gmail.com | test03   | $2a$10$UbvmdhfcKxSNr/I4CjOLtOkKGX/j4/xQfFrv3FizxwEVk6D9sAoO  |
+----+--------+------------------+----------+--------------------------------------------------------------+
2 rows in set (0,00 sec)

我的主要问题是,当我使用基于spring.data的@瞬态注释时,密码字段已经持久化了。为什么?为什么我要在密码字段上使用@瞬态注释呢?

感谢您的指导和帮助,提前!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-12 21:35:30

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

代码语言:javascript
复制
@Entity
public class User {

@Id
private long id;

@Column(name = "username")
private String username;

@Column(name = "email")
private String email;

@Column(name = "password")
private String password;

}

现在,要将这个java实体对象映射为JSON格式,可以使用映射框架(例如jackson:com.fasterxml.jackson.databind.ObjectMapper),也可以手动执行。

当将user 2对象转换为JSON时,您将获得的JSON格式输出是:

代码语言:javascript
复制
{
   "id": 2,
   "email": "test03@gmail.com",
   "username": "test03",
   "password": "$2a$10$UbvmdhfcKxSNr/I4CjOLtOkKGX/j4/xQfFrv3FizxwEVk6D9sAoO"
}

现在,如果您添加:

代码语言:javascript
复制
@org.springframework.data.annotation.Transient
@Column(name = "password")
private String password;

然后使用映射框架再次为用户2实体生成JSON:

代码语言:javascript
复制
{
   "id": 2,
   "email": "test03@gmail.com",
   "username": "test03",
}

注意,您的JSON输出中缺少密码字段。这是因为@org.springframework.data.annotation.Transient明确声明了您使用的Object在从Java转换到JSON时不应该包含这个值的spring框架。

还请注意,如果您试图将上面的实体持久化到数据库中,它仍然会将其保存到数据库中,因为@org.springframework.data.annotation.Transient只应用于对象映射框架,而不是JPA。

因此,概括地说:

transient适用于所有序列化(通过有线、保存到磁盘、保存到db) javax.persistence.Transient专门用于JPA序列化,@org.springframework.data.annotation.Transient用于ObjectMapping框架序列化

票数 45
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42750977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档