programing

Jackson: 필드 직렬화를 방지하는 방법

yoursource 2022. 9. 3. 16:58
반응형

Jackson: 필드 직렬화를 방지하는 방법

암호 필드를 가진 엔티티 클래스가 있습니다.

class User {
    private String password;

    //setter, getter..
}

직렬화 중에 이 필드를 건너뜁니다.하지만 그것은 여전히 역직렬화 될 수 있을 것이다.이것은 클라이언트가 새로운 비밀번호를 보낼 수 있지만 현재 비밀번호를 읽을 수 없도록 하기 위해 필요합니다.

잭슨이랑 어떻게 해?

라고 표시할 수 있습니다.@JsonIgnore.

1.9에서는,@JsonIgnoregetter를 위해서@JsonPropertysetter의 경우 시리얼화되지 않고 역직렬화됩니다.

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

반응형