2016-11-22 13 views
8

私たちのアプリケーションでは、各リクエストとレスポンスのJsonプロパティ値(プロパティ名ではありません)を暗号化/復号化する必要があります。 例、
{"userName":"encrypted value", "email":"encrypted value"}Springブート - JSONデータの暗号化

我々はスプリントブーツ1.3を使用して、我々はオブジェクトに要求JSONを結合して、JSONとしてレスポンスオブジェクトをシリアライズする@RequestBody@ResponseBody注釈を使用しています。

私たちの各コントローラメソッドでは、暗号化/復号化メソッドを呼びたいと思っています。要求オブジェクトにバインドする前にjson値を解読するようにスプリントに指示する方法はありますか?同様に、レスポンスオブジェクトのフィールド値をjsonに変換する前に暗号化するには?またはジャクソンをカスタマイズすることは私たちを助けるかもしれない?

ありがとうございます!

+0

カスタムクライアントを構築し、前にサービスを呼び出すが、それを行う... – johnnynemonic

+0

何セッターゲッターと暗号解読に実装についての? –

+1

AbstractJackson2HttpMessageConverterを拡張することは、jsonレスポンスが構築される場所と、フラッシュされる前の最後の場所であるため、より具体的なものにすることはできませんか? – bigbadmouse

答えて

8

あなた自身のhttpメッセージコンバータを書くことができます。あなたはスプリングブートを使用しているので、それは非常に簡単です:AbstractHttpMessageConverterからカスタムコンバータを拡張して、クラスに@Componentアノテーションを付けてください。 spring docsから

あなたは、単に春ブーツコンテキストでその種類の豆を追加することによって、追加のコンバータを貢献することができます。追加するBeanが、デフォルトでは(JSON変換の場合はMappingJackson2HttpMessageConverterのように)デフォルトでインクルードされるタイプの場合、デフォルト値が置き換えられます。

そして、ここでは簡単な例です:

@Component 
public class Converter extends AbstractHttpMessageConverter<Object> { 

    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); 

    @Inject 
    private ObjectMapper objectMapper; 

    public Converter(){ 
     super(MediaType.APPLICATION_JSON_UTF8, 
      new MediaType("application", "*+json", DEFAULT_CHARSET)); 
    } 

    @Override 
    protected boolean supports(Class<?> clazz) { 
     return true; 
    } 

    @Override 
    protected Object readInternal(Class<? extends Object> clazz, 
            HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { 
     return objectMapper.readValue(decrypt(inputMessage.getBody()), clazz); 
    } 

    @Override 
    protected void writeInternal(Object o, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { 
     outputMessage.getBody().write(encrypt(objectMapper.writeValueAsBytes(o))); 
    } 

    private InputStream decrypt(InputStream inputStream){ 
     // do your decryption here 
     return inputStream; 
    } 

    private byte[] encrypt(byte[] bytesToEncrypt){ 
     // do your encryption here 
     return bytesToEncrypt; 
    } 
} 
+0

これはjson全体が暗号化されている場合に機能します。しかし、私たちの場合、jsonのプロパティ値だけが暗号化されます。 – Raj

+0

'encrypt'と' decrypt'メソッドの実装方法はあなた次第です。私は 'JsonNode'を使って、すべてのjsonオブジェクト値を反復してそれらを暗号化/復号化することができると思います。 – eparvan

+0

ありがとうございます! – Raj

関連する問題