springmvc 對 jsonp 的支持

在與前端開發人員合做過程當中,常常遇到跨域名訪問的問題,一般咱們是經過jsonp調用方式來解決。jsop百科:http://baike.baidu.com/link?url=JKlwoETqx2uuKeoRwlk_y6HZ9FZxXTARLwm7QFOmuqex5p6-Ch5GQpSM5juf614F8hYaP2N3wDkU26slwvtnOa前端

如:請求 http://xxxx?&callback=exec , 那麼返回的jsonp格式爲 exec({"code":0, "message":"success"}); 。 其實對於格式的從新封裝並不複雜,可是對於某個請求既要支持json返回也要支持jsop返回怎麼作,那咱們就得作個判斷, if(request.getParameter("callback")  != null),  若是存在就返回jsonp, 不存在就返回json。 spring

在使用springmvc的場景下,如何利用springmvc來返回jsonp格式,有不少方式能夠實現。 這裏介紹一種比較簡單但比較通用的處理方式。前提是你使用的springmvc是4.1版本及以上。主要是要繼承類AbstractJsonpResponseBodyAdvice, 並加入@ControllerAdvice 這個註解,basePackages 標識要被處理的controller。json

實現代碼以下:跨域

 1 @ControllerAdvice(basePackages = "xxx.controller")
 2 public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
 3 
 4     private final String[] jsonpQueryParamNames;
 5 
 6     public JsonpAdvice() {
 7         super("callback", "jsonp");
 8         this.jsonpQueryParamNames = new String[]{"callback"};
 9     }
10 
11     @Override
12     protected void beforeBodyWriteInternal(MappingJacksonValue bodyContainer, MediaType contentType,
13                                            MethodParameter returnType, ServerHttpRequest request, ServerHttpResponse response) {
14 
15         HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest();
16      
17      //若是不存在callback這個請求參數,直接返回,不須要處理爲jsonp
18         if (ObjectUtils.isEmpty(servletRequest.getParameter("callback"))) {
19             return;
20         }
21      //按設定的請求參數(JsonAdvice構造方法中的this.jsonpQueryParamNames = new String[]{"callback"};),處理返回結果爲jsonp格式
22         for (String name : this.jsonpQueryParamNames) {
23             String value = servletRequest.getParameter(name);
24             if (value != null) {
25                 MediaType contentTypeToUse = getContentType(contentType, request, response);
26                 response.getHeaders().setContentType(contentTypeToUse);
27                 bodyContainer.setJsonpFunction(value);
28                 return;
29             }
30         }
31     }
32 }
相關文章
相關標籤/搜索