Spring Boot:在JSONP回调函数名之前删除/ ** /

时间:2015-11-09 03:08:07

标签: java spring spring-boot jsonp

我正在使用@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});

如何在回调前删除/ ** /? 感谢。

3 个答案:

答案 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攻击。