jsonp跨域請求

來源:互聯網
上載者:User

標籤:

前端時間因為太忙,一直沒有處理跨域這個事情,今天抽了一個小時輕鬆解決,突然發現上個月又寫了很多重複代碼。因為現在公司項目分為多個工程,前後端完全分離,manage工程做所有商務邏輯處理,app、兩個前置工程通過httpClient去調用manage工程的restful介面,而我就是負責這個工程,久而久之發現真的重複了很多controller層的代碼,愈發啟用了這個所有介面支援瀏覽器跨域請求的封裝。話不多講,見核心代碼

1,定義一個類,繼承MappingJackson2HttpMessageConverter,重寫writeInternal方法,方法裡簡單判斷一下是否帶有callback參數,沒有直接返回資料,有的話將資料用callback參數的值括弧包裹起來返回。
import java.io.IOException;import javax.servlet.http.HttpServletRequest;import org.apache.commons.io.IOUtils;import org.apache.commons.lang3.StringUtils;import org.springframework.http.HttpOutputMessage;import org.springframework.http.converter.HttpMessageNotWritableException;import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import com.fasterxml.jackson.core.JsonEncoding;import com.fasterxml.jackson.core.JsonProcessingException;public class CallbackMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {    // 做jsonp的支援的標識,在請求參數中加該參數    private String callbackName;    @Override    protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException,            HttpMessageNotWritableException {        // 從threadLocal中擷取當前的Request對象        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder                .currentRequestAttributes()).getRequest();        String callbackParam = request.getParameter(callbackName);        if (StringUtils.isEmpty(callbackParam)) {            // 沒有找到callback參數,直接返回json資料            super.writeInternal(object, outputMessage);        } else {            JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType());            try {                String result = callbackParam + "(" + super.getObjectMapper().writeValueAsString(object)                        + ");";                IOUtils.write(result, outputMessage.getBody(), encoding.getJavaName());            } catch (JsonProcessingException ex) {                throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);            }        }    }    public String getCallbackName() {        return callbackName;    }    public void setCallbackName(String callbackName) {        this.callbackName = callbackName;    }}

 

2.定義Java bean,注意修改class掃描路徑,這樣每次請求過來都會調起MappingJackson2HttpMessageConverter類裡的riteInternal這個方法,如果請求帶上了callback參數,則將以callbackValue(‘data‘)格式的資料返回給前端。
<!-- 定義註解驅動 -->    <mvc:annotation-driven>        <mvc:message-converters register-defaults="true">            <bean                class="xxx.xxx.xxx.CallbackMappingJackson2HttpMessageConverter">                <property name="callbackName" value="callback" />            </bean>        </mvc:message-converters>    </mvc:annotation-driven>

 

3.前端通過jquery封裝的ajax方式調用,這裡做了一些代碼節省,關鍵代碼已紅色標出
<script type="text/javascript">    var feedback = {        init: function(){            var self = feedback;            self.bind();        },        test: function(data){            console.log("測試jsonp",data)        },        bind: function(){             var self = feedback;             var par = {};                 par.callback = ‘feedback.test‘;             $.ajax({                  url:"http://manage.danong.com/rest/open/queryInviteList",                  data: par,                dataType:‘jsonp‘,                  jsonp:‘callback‘,                 timeout:3000              });          }    }    feedback.init();</script>

 

4.瀏覽器列印log

 

jsonp跨域請求

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.