Jackson: 필드 직렬화를 방지하는 방법
암호 필드를 가진 엔티티 클래스가 있습니다.
class User {
private String password;
//setter, getter..
}
직렬화 중에 이 필드를 건너뜁니다.하지만 그것은 여전히 역직렬화 될 수 있을 것이다.이것은 클라이언트가 새로운 비밀번호를 보낼 수 있지만 현재 비밀번호를 읽을 수 없도록 하기 위해 필요합니다.
잭슨이랑 어떻게 해?
라고 표시할 수 있습니다.@JsonIgnore
.
1.9에서는,@JsonIgnore
getter를 위해서@JsonProperty
setter의 경우 시리얼화되지 않고 역직렬화됩니다.
StaxMan이 말한 것을 예로 들자면, 이것은 나에게 효과가 있다.
private String password;
@JsonIgnore
public String getPassword() {
return password;
}
@JsonProperty
public void setPassword(String password) {
this.password = password;
}
간단한 방법은 게터 및 세터에 주석을 다는 것입니다.
다음은 일반 텍스트 암호를 제외하도록 수정된 원본 예제입니다. 그런 다음 암호 필드를 암호화된 텍스트로 반환하는 새 메서드에 주석을 추가합니다.
class User {
private String password;
public void setPassword(String password) {
this.password = password;
}
@JsonIgnore
public String getPassword() {
return password;
}
@JsonProperty("password")
public String getEncryptedPassword() {
// encryption logic
}
}
잭슨 2.6부터는 속성을 읽기 전용 또는 쓰기 전용으로 표시할 수 있습니다.두 접근기 모두에서 주석을 해킹하는 것보다 간단하며 모든 정보를 한 곳에 보관합니다.
public class User {
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String password;
}
이외에는@JsonIgnore
그 밖에도 몇 가지 가능성이 있습니다.
- JSON 뷰를 사용하여 필드를 조건부로 필터링합니다(디폴트로는 역직렬화에는 사용되지 않습니다.2.0에서는 시리얼화, 역직렬화에 대해 다른 뷰를 사용할 수 있습니다).
@JsonIgnoreProperties
수업 중에 도움이 될 수 있다
transient
이 솔루션은 Java에서 기본 제공되므로 다른 프레임워크별 주석을 추가할 필요가 없습니다.
패스워드에 퍼블릭게터 방식을 사용하는 이유를 묻습니다.휴지 상태 또는 기타 ORM 프레임워크는 개인 getter 메서드로 사용할 수 있습니다.패스워드가 맞는지 확인하기 위해
public boolean checkPassword(String password){
return this.password.equals(anyHashingMethod(password));
}
잭슨에는 SimpleBeanPropertyFilter라는 이름의 클래스가 있습니다.이 클래스는 글로벌하지 않고 시리얼화 및 역직렬화 중에 필드를 필터링하는 데 도움이 됩니다.그게 당신이 원했던 것 같아요.
@JsonFilter("custom_serializer")
class User {
private String password;
//setter, getter..
}
그러면 코드:
String[] fieldsToSkip = new String[] { "password" };
ObjectMapper mapper = new ObjectMapper();
final SimpleFilterProvider filter = new SimpleFilterProvider();
filter.addFilter("custom_serializer",
SimpleBeanPropertyFilter.serializeAllExcept(fieldsToSkip));
mapper.setFilters(filter);
String jsonStr = mapper.writeValueAsString(currentUser);
이렇게 하면password
[ ] 를 클릭합니다.또, 디시리얼라이즈도 할 수 있습니다.password
필드 그대로입니다.ObjectMapper 개체에 필터가 적용되지 않았는지 확인하십시오.
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(yourJsonStr, User.class); // user object does have non-null password field
변수를 로 설정하다
@Json Ignore
이를 통해 json serializer에서 변수를 건너뛸 수 있습니다.
언급URL : https://stackoverflow.com/questions/9112900/jackson-how-to-prevent-field-serialization
'programing' 카테고리의 다른 글
ClassNotFoundException 해결방법 (0) | 2022.09.03 |
---|---|
스프링 부트 속성 파일에서 암호를 숨기는 방법 (0) | 2022.09.03 |
Maven 환경 변수 (0) | 2022.09.03 |
왜 여기에 정수 리터럴을 넣어야 하는지 아세요? (0) | 2022.09.03 |
서브클래스는 개인 필드를 상속합니까? (0) | 2022.08.29 |