使用Httpclient 完美解決服務端跨域問題

   項目需求:


     jsonp是從前臺js的角度考慮,經過Ajax調用springMVC的接口。同一個ip、同一個網絡協議、同一個端口,三者都知足就是同一個域,不然就是跨域問題了。首頁廣告須要一個輪播的效果,取後臺數據json格式。上篇博客介紹了使用jsonp來解決跨域,如今有個新的方法來解決,那就是:ajax請求地址改成本身系統的後臺地址,以後在本身的後臺用HttpClient請求url。封裝好的跨域請求url工具類。封裝一個get一個POST便可。html


    二者的區別就在於,jsonp是基於客戶端的跨域解決。而httpclient是基於服務端的跨域解決。java


    我如今有兩個maven項目:node


Taotao-portal(8082端口)

Taotao-rest(8081端口)ajax


    要使用httpclient須要在maven中引用(portal):spring


  1. <!-- httpclient -->  
  2. <dependency>  
  3.     <groupId>org.apache.httpcomponents</groupId>  
  4.     <artifactId>httpclient</artifactId>  
  5. </dependency>  


    rest項目中寫了個後臺的服務調廣告的數據,在portal項目中的service層來調用rest項目中的controller層提供的服務。apache


httpclient工做圖解:


核心代碼展現:


(portal項目)contentcontroller.javajson

  1. @Controller  
  2. public class ContentController {  
  3.     @Autowired  
  4.     private ContentService contentService;  
  5.           
  6.     //getdata  
  7.     @RequestMapping("/content/{cid}")  
  8.     @ResponseBody  
  9.     public TaotaoResult getConentList(@PathVariable Long cid){  
  10.           
  11.         try {  
  12.             List<TbContent> list=contentService.getContentList(cid);  
  13.             return TaotaoResult.ok(list);  
  14.         } catch (Exception e) {  
  15.             e.printStackTrace();  
  16.             return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));  
  17.         }  
  18.     }  
  19. }  


(portal項目)HttpClientUtil.java
跨域

  1. package com.taotao.common.utils;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.URI;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8.   
  9. import org.apache.http.NameValuePair;  
  10. import org.apache.http.client.entity.UrlEncodedFormEntity;  
  11. import org.apache.http.client.methods.CloseableHttpResponse;  
  12. import org.apache.http.client.methods.HttpGet;  
  13. import org.apache.http.client.methods.HttpPost;  
  14. import org.apache.http.client.utils.URIBuilder;  
  15. import org.apache.http.entity.ContentType;  
  16. import org.apache.http.entity.StringEntity;  
  17. import org.apache.http.impl.client.CloseableHttpClient;  
  18. import org.apache.http.impl.client.HttpClients;  
  19. import org.apache.http.message.BasicNameValuePair;  
  20. import org.apache.http.util.EntityUtils;  
  21.   
  22. public class HttpClientUtil {  
  23.   
  24.     public static String doGet(String url, Map<String, String> param) {  
  25.   
  26.         // 建立Httpclient對象  
  27.         CloseableHttpClient httpclient = HttpClients.createDefault();  
  28.   
  29.         String resultString = "";  
  30.         CloseableHttpResponse response = null;  
  31.         try {  
  32.             // 建立uri  
  33.             URIBuilder builder = new URIBuilder(url);  
  34.             if (param != null) {  
  35.                 for (String key : param.keySet()) {  
  36.                     builder.addParameter(key, param.get(key));  
  37.                 }  
  38.             }  
  39.             URI uri = builder.build();  
  40.   
  41.             // 建立http GET請求  
  42.             HttpGet httpGet = new HttpGet(uri);  
  43.   
  44.             // 執行請求  
  45.             response = httpclient.execute(httpGet);  
  46.             // 判斷返回狀態是否爲200  
  47.             if (response.getStatusLine().getStatusCode() == 200) {  
  48.                 resultString = EntityUtils.toString(response.getEntity(), "UTF-8");  
  49.             }  
  50.         } catch (Exception e) {  
  51.             e.printStackTrace();  
  52.         } finally {  
  53.             try {  
  54.                 if (response != null) {  
  55.                     response.close();  
  56.                 }  
  57.                 httpclient.close();  
  58.             } catch (IOException e) {  
  59.                 e.printStackTrace();  
  60.             }  
  61.         }  
  62.         return resultString;  
  63.     }  
  64.   
  65.     public static String doGet(String url) {  
  66.         return doGet(url, null);  
  67.     }  
  68.   
  69.     public static String doPost(String url, Map<String, String> param) {  
  70.         // 建立Httpclient對象  
  71.         CloseableHttpClient httpClient = HttpClients.createDefault();  
  72.         CloseableHttpResponse response = null;  
  73.         String resultString = "";  
  74.         try {  
  75.             // 建立Http Post請求  
  76.             HttpPost httpPost = new HttpPost(url);  
  77.             // 建立參數列表  
  78.             if (param != null) {  
  79.                 List<NameValuePair> paramList = new ArrayList<>();  
  80.                 for (String key : param.keySet()) {  
  81.                     paramList.add(new BasicNameValuePair(key, param.get(key)));  
  82.                 }  
  83.                 // 模擬表單  
  84.                 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);  
  85.                 httpPost.setEntity(entity);  
  86.             }  
  87.             // 執行http請求  
  88.             response = httpClient.execute(httpPost);  
  89.             resultString = EntityUtils.toString(response.getEntity(), "utf-8");  
  90.         } catch (Exception e) {  
  91.             e.printStackTrace();  
  92.         } finally {  
  93.             try {  
  94.                 response.close();  
  95.             } catch (IOException e) {  
  96.                 // TODO Auto-generated catch block  
  97.                 e.printStackTrace();  
  98.             }  
  99.         }  
  100.   
  101.         return resultString;  
  102.     }  
  103.   
  104.     public static String doPost(String url) {  
  105.         return doPost(url, null);  
  106.     }  
  107.       
  108.     public static String doPostJson(String url, String json) {  
  109.         // 建立Httpclient對象  
  110.         CloseableHttpClient httpClient = HttpClients.createDefault();  
  111.         CloseableHttpResponse response = null;  
  112.         String resultString = "";  
  113.         try {  
  114.             // 建立Http Post請求  
  115.             HttpPost httpPost = new HttpPost(url);  
  116.             // 建立請求內容  
  117.             StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);  
  118.             httpPost.setEntity(entity);  
  119.             // 執行http請求  
  120.             response = httpClient.execute(httpPost);  
  121.             resultString = EntityUtils.toString(response.getEntity(), "utf-8");  
  122.         } catch (Exception e) {  
  123.             e.printStackTrace();  
  124.         } finally {  
  125.             try {  
  126.                 response.close();  
  127.             } catch (IOException e) {  
  128.                 // TODO Auto-generated catch block  
  129.                 e.printStackTrace();  
  130.             }  
  131.         }  
  132.   
  133.         return resultString;  
  134.     }  
  135. }  

(rest項目)contentserviceimpl.java

  1. @Service  
  2. public class ContentServiceImpl implements ContentService {  
  3.   
  4.     //service 寫活,讀配置文件  
  5.     @Value("${REST_BASE_URL}")  
  6.     private String REST_BASE_URL;  
  7.     @Value("${REST_CONTENT_URL}")  
  8.     private String REST_CONTENT_URL;  
  9.     @Value("${REST_CONTENT_AD1_CID}")  
  10.     private String REST_CONTENT_AD1_CID;  
  11.     @Override  
  12.     public String getAd1List() {  
  13.         //調用服務得到數據  跨域請求:http://localhost:8081/content/89  
  14.         String json = HttpClientUtil.doGet(REST_BASE_URL + REST_CONTENT_URL + REST_CONTENT_AD1_CID);  
  15.         //把json轉換成java對象  
  16.         TaotaoResult taotaoResult = TaotaoResult.formatToList(json, TbContent.class);  
  17.         //取data屬性,內容列表  
  18.         List<TbContent> contentList = (List<TbContent>) taotaoResult.getData();  
  19.         //把內容列表轉換成AdNode列表  
  20.         List<AdNode> resultList = new ArrayList<>();  
  21.         for (TbContent tbContent : contentList) {  
  22.             AdNode node = new AdNode();  
  23.             node.setHeight(240);  
  24.             node.setWidth(670);  
  25.             node.setSrc(tbContent.getPic());  
  26.               
  27.             node.setHeightB(240);  
  28.             node.setWidthB(550);  
  29.             node.setSrcB(tbContent.getPic2());  
  30.               
  31.             node.setAlt(tbContent.getSubTitle());  
  32.             node.setHref(tbContent.getUrl());  
  33.               
  34.             resultList.add(node);  
  35.         }  
  36.         //須要把resultList轉換成json數據  
  37.         String resultJson = JsonUtils.objectToJson(resultList);  
  38.         return resultJson;  
  39.     }  
  40. }  

(rest項目)indexcontroller

  1. @Autowired  
  2.     private ContentService contentService;  
  3.       
  4.     @RequestMapping("/index")  
  5.     public String showIndex(Model model){  
  6.         String json=contentService.getAd1List();  
  7.         model.addAttribute("ad1",json);  
  8.         return "index";  
  9.     }  


查看網頁源代碼,能夠看到傳過來的json格式的數據。網絡



總結:


      HttpClient與Jsonp可以輕易的解決跨域問題,從而獲得本身想要的數據(來自不一樣IP,協議,端口),惟一的不一樣點是,HttpClient是在Java代碼中進行跨域訪問,而Jsonp是在js中進行跨域訪問。跨域還有一級跨域,二級跨域,更多內容值得研究。
app

相關文章
相關標籤/搜索