瀏覽器解析ajax發起跨域請求.程序雖然能夠正確的調用,可是瀏覽器能夠監控用戶的全部的參數及返回值.在一些特定的條件下該操做不安全.(例如:支付寶支付操做)
通常使用跨域的請求都是用來獲取其餘服務器的數據(查詢操做),若是遇到了POST須要提交的參數應該使用更加安全的請求方式實現.html
HTTP 協議多是如今 Internet 上使用得最多、最重要的協議了,愈來愈多的 Java 應用程序須要直接經過 HTTP 協議來訪問網絡資源。雖然在 JDK 的 java net包中已經提供了訪問 HTTP 協議的基本功能,可是對於大部分應用程序來講,JDK 庫自己提供的功能還不夠豐富和靈活。HttpClient 是 Apache Jakarta Common 下的子項目,用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,而且它支持 HTTP 協議最新的版本和建議。HttpClient 已經應用在不少的項目中,好比 Apache Jakarta 上很著名的另外兩個開源項目 Cactus 和 HTMLUnit 都使用了 HttpClient。如今HttpClient最新版本爲 HttpClient 4.5 .6(2015-09-11)前端
以上是百度的概念java
總結來講就是:HttpClient是用來提供高效的、最新的、功能豐富的支持HTTP協議的客戶端編程工具包web
<!--添加httpClient jar包 --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency>
public class TestHttpClient { /** * 步驟: * 1.實例化httpClient工具API * 2.定義請求url地址 任意網絡地址.... * 3.定義請求的類型 get/post/put/delete * 4.發起請求,獲取響應的結果 * 5.判斷響應的狀態碼信息. 200 404 500 406 400.... * 6.動態解析返回值執行後續操做. */ @Test public void test01(){ HttpClient httpClient = HttpClients.createDefault(); String url = "https://www.baidu.com/"; HttpGet get = new HttpGet(url); try { HttpResponse httpResponse = httpClient.execute(get); //判斷狀態碼是否正確 int statusCode = httpResponse.getStatusLine().getStatusCode(); if(statusCode == 200){ //表示請求正確 HttpEntity httpEntity = httpResponse.getEntity(); //獲取服務器的所有響應信息(json/html/xml/xxxx) String result = EntityUtils.toString(httpEntity,"UTF-8"); //獲取以後能夠執行業務處理...... System.out.println(result); } } catch (IOException e) { e.printStackTrace(); } } }
需求:根據userId查詢用戶的信息.
1.用戶的url地址: http://www.xx.com/findUserById/7
;
2.須要在xx-web的Controller中動態的接收數據.將請求轉給sso單點登陸系統;
url:http://sso.xx.com/findUserById/7
3.在jt-sso中的Controller根據userId查詢用戶信息.ajax
前端controller接收客戶端http請求apache
/** * 爲了測試httpClient 實現業務功能查詢用戶信息 * url地址:http://www.jt.com/user/findUserById/7 * 參數: 7用戶ID * 返回值: user對象 */ @RequestMapping("/findUserById/{userId}") @ResponseBody public User findUserById(@PathVariable Long userId){ return userService.findUserById(userId); }
在前端service中經過入門案例中的六步,進行遠程跨域調用後端編程
@Service public class UserServiceImpl implements UserService{ /** * 由xx-web向xx-sso進行數據的請求.以後獲取數據. * @param userId * @return */ @Override public User findUserById(Long userId) { //1.定義url地址 String url = "http://sso.xx.com/user/findUserById/"+userId; HttpClient httpClient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(url); try { HttpResponse httpResponse = httpClient.execute(httpGet); if(httpResponse.getStatusLine().getStatusCode() == 200){ HttpEntity httpEntity = httpResponse.getEntity(); //json格式 String result = EntityUtils.toString(httpEntity, "UTF-8"); return ObjectMapperUtil.toObject(result, User.class); }else{ throw new RuntimeException("請求失敗,請校驗地址信息"); } } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } } }
後端controller接收httpclient發送的遠程調用請求json
/** * 測試httpClient調用方式 * url地址: http://sso.jt.com/user/findUserById/"+userId * 返回: user對象的JSON數據 */ @RequestMapping("/findUserById/{userId}") public User findUserById(@PathVariable Long userId){ return userService.findUserById(userId); }
實現後端 service查詢業務實現後端
@Override public User findUserById(Long userId) { return userMapper.selectById(userId); }