Iは、以下のJSONペイロードを返しバネRESTコントローラを有する:Spring RESTリポジトリからJSONレスポンスをラップする方法は?
[
{
"id": 5920,
"title": "a title"
},
{
"id": 5926,
"title": "another title",
}
]
その対応するGETリクエストメソッドでRESTコントローラ:
@RequestMapping(value = "example")
public Iterable<Souvenir> souvenirs(@PathVariable("user") String user) {
return new souvenirRepository.findByUserUsernameOrderById(user);
}
すぐお土産クラスはPOJOである:
@Entity
@Data
public class Souvenir {
@Id
@GeneratedValue
private long id;
private String title;
private Date date;
}
についてhttps://www.owasp.org/index.php/OWASP_AJAX_Security_Guidelines#Always_return_JSON_with_an_Object_on_the_outsideとhttp://haacked.com/archive/2009/06/25/json-hijacking.aspx/私はオブジェクト内で応答をラップしたいと思いますそれは攻撃に対して脆弱ではありません。これは、次のJSONペイロードになり
@RequestMapping(value = "example")
public SouvenirWrapper souvenirs(@PathVariable("user") String user) {
return new SouvenirWrapper(souvenirRepository.findByUserUsernameOrderById(user));
}
@Data
class SouvenirWrapper {
private final List<Souvenir> souvenirs;
public SouvenirWrapper(List<Souvenir> souvenirs) {
this.souvenirs = souvenirs;
}
}
:
{
"souvenirs": [
{
"id": 5920,
"title": "a title"
},
{
"id": 5926,
"title": "another title",
}
]
}
これは、いくつかのJSON/Javascriptの攻撃を防ぐのに役立ちますが、私はの冗長性を好きではないもちろん、私はこのような何かを行うことができますラッパークラス。もちろん、ジェネリックで上記のアプローチを一般化することができます。 Springエコシステムで同じ結果を達成する別の方法がありますか(注釈などありますか?)考え方は、動作がSpringによって自動的に行われるということです。したがって、オブジェクトのリストを返すRESTコントローラがあるときは常に、そのオブジェクトをオブジェクトラッパー内にラップしてオブジェクトの直接リストがシリアル化されないようにすることができます。
春の代替?あなたは何をしゃべってますか? Strutsはそれを持っています、春はありません。あなたの質問を精緻化する。ラッパーだけが帽子です。春はあなたに持っています。もしフィナーレでなければ、メッセージをその場で拡張するかもしれません。 –
ここに行きます:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/method/support/HandlerMethodReturnValueHandler.html。独自の実装では、必要な構造体にラップすることができます。 –
何か面白い質問..実際の値がiterableであれば@ControllerAdviceで再生しようとすることもできますし、デシリアライザをハイジャックすることもできます。おそらくジャクソンのHttpメッセージコンバータを試してみてください。私たちを掲示し続ける:) –