我正在使用@ControllerAdvice尝试JSONP响应。但是在回调函数名称之前会出现不必要的注释。
的build.gradle
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
compile 'org.springframework.boot:spring-boot-starter-web:1.2.7.RELEASE'
}
应用
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
控制器
@RestController
public class Controller {
@ControllerAdvice
public static class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
public JsonpAdvice() {
super("callback");
}
}
@RequestMapping("/product")
public Product product(@RequestParam(value = "callback", required = false) String callback) {
return new Product(1, "foo", 100);
}
}
产品
public class Product {
int id;
String name;
int price;
public int getId() {
return id;
}
/* getters, setters, constructor */
}
结果http://localhost:8080/product?callback=callback
/**/callback({"id":1,"name":"foo","price":100});
如何在回调前删除/ ** /? 感谢。
答案 0 :(得分:2)
我遇到了与你完全相同的问题,因此找到了你的帖子。但是,基于 Spring Boot 源代码:
@Override
protected void writePrefix(JsonGenerator generator, Object object) throws IOException {
if (this.jsonPrefix != null) {
generator.writeRaw(this.jsonPrefix);
}
String jsonpFunction =
(object instanceof MappingJacksonValue ? ((MappingJacksonValue) object).getJsonpFunction() : null);
if (jsonpFunction != null) {
generator.writeRaw("/**/");//NB! This is the added content
generator.writeRaw(jsonpFunction + "(");
}
}
来自https://github.com/spring-projects/spring-framework/blob/master/spring-web/src/main/java/org/springframework/http/converter/json/MappingJackson2HttpMessageConverter.java的,
在有generator.writeRaw("/**/");
的地方,我真的不认为作者错误地添加了这个陈述,他必须故意添加它并且他根本不希望它被删除。所以好奇心激励我几个小时来调查这个问题。 在jsonp回调函数名称之前添加语句generator.writeRaw("/**/");
,即/ ** /的原因是安全性。
在链接https://miki.it/blog/2014/7/8/abusing-jsonp-with-rosetta-flash/中,它被告知"要同时受content sniffing attacks(click to see the meaning)保护,请使用/ ** /添加反射回调。这正是Google,Facebook和GitHub目前正在做的事情。"
即使谷歌,Facebook和GitHub目前正在这样做,我们是否有理由删除/**/
?在我看来,我们绝对应该坚持下去。我确实尝试在html客户端中使用带有前置/**/
的jsonp回调,它仍然可以正常工作。此外,jsonp回调实现应该考虑其他缓解并修复https://miki.it/blog/2014/7/8/abusing-jsonp-with-rosetta-flash/中的建议。 [Yahoo Finance REST API实现https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22BHP.AX%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=foo
是一个典型的例子。可以使用一些Header读取工具读取头信息,以查看它是如何实现的,目的是避免json劫持。
答案 1 :(得分:0)
@Configuration Annotation在声明它的地方
function GenerateReport(packageID) {
var repType = '@ViewBag.ReportType';
$.ajax({
url: '/turnover/GetTurnover' + repType,//?packageID=' + packageID,
data: { "packageID": packageID },
cache: false,
type: 'POST',
datatype: 'JSON',
success: function (response) {
debugger;
替换类“MappingJackson2HttpMessageConverter”
答案 2 :(得分:0)
generator.writeRaw("/**/");//NB! This is the added content
作为安全原因的上述代码,实际上还有另一种方法:
generator.writeRaw("\r\n")
避免xss攻击。