JsonP、跨域、HttpClient

一、JsonP

        Jsonp(JSON with Padding):是json的一种“使用模式”,可以让网页从别的域名(网站)那获取资料,即跨域读取数据

        JSONP 的优点是:它不像XMLHttpRequest 对象实现的 Ajax 请求那样受到同源策略的 限制;它的兼容性更好,在更加古老的浏览器中都可以运行,不需要 XMLHttpRequest 或 ActiveX 的支持;并且在请求完毕后可以通过调用 callback 的方式回传结果。

        JSONP 的缺点则是:它只支持GET 请求而不支持 POST 等其它类型的 HTTP 请求;它只支持跨域 HTTP 请求这种情况,不能解决不同域的两个页面之间如何进行 JavaScript 调用的问题。

        原理是利用Script标签的src属性突破同源限制

二、跨域

    跨域是指一个域(网站)下的文档或脚本视图去请求另一个域(网站)下的资源

        同源策略/SOP(Same origin policy):是一种约定,由 Netscape 公司 1995 年引入浏览器, 它是浏览器最核心也最基本的安全功能,现在所有支持JavaScript 的浏览器都会使用这个策 略。如果缺少了同源策略,浏览器很容易受到 XSS、CSFR 等攻击。所谓同源是指"协议+域 名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源。

跨域和同源策略

三、使用JsonP实现跨域

    前台页面:

        1.发送ajax请求时要指定请求格式为GET,

        2.指定dataType类型为:jsonp

        3.定义jsonp返回的数据

        4.编写回调函数

    控制器:

        1.将响应数据返回值改为String

        2.使用json工具类将数据转换为json格式

        3.返回字符串并手动拼接jsonp数据

    在Controller中使用MappingJacksonValue实现跨域响应

        1.将返回值改为Obj类型,参数还是String类型

        2.创建MappingJacksonValue对象,并将要转换的数据给入

        3.调用方法setJsonFunction()方法将字符串自动拼接

        4.直接返回MappingJacksonValue


四、HttpClient

        HttpClient:HttpClient是Apache Jakarta Common下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议

        HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net 包中已经提 供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能 还不够丰富和灵活。

    HttpClient发送Get请求不带参数

        1.获取HttpClient对象,创建get请求对象传入URL

        2.调用HttpClient中的execute方法执行请求,返回响应结果

        3.获取……信息

        4.关闭HttpClient连接


    HttpClient发送Get请求带参数

        1.获取HttpClient对象,创建存储URI的对象URIBuilder并将URI给入,并且可以调用URIBuiler的add方法添加参数

        2.创建get请求对象,将URIBuiler对象传入并转换为Uri

        3.调用HttpClient的execute方法执行请求

        4.获取……信息

        5.关闭HttpClient连接


    HttpClient发送POST请求不带参数

        1.获取HttpClient对象,创建HttpPost对象,并设置URI

        2.使用HttpClient中的execute方法执行请求

        3.获取……信息

        4.关闭连接

为了配合演示效果,在本机上新建了war工程,启动tomcat等待访问并接收参数


    HttpClient发送POST请求带参数

        1.获取HttpClient对象,创建HttpPost对象,并设置请求URI

        2.创建list集合存储参数,集合泛型为BasicNameValuePair格式

        3.创建UrlEncodedFormEntity对象将请求参数转换为字符串

        4.调用HttpPost对象的setEntity方法绑定参数

        5.使用HttpClient中的execute方法执行响应

        6.获取……信息

        7.关闭连接

为了请求地址方便和结果展示,创建war工程并且编写控制器接收参数


    HttpClient发送POST请求带Json格式参数

        1.获取HttpClient对象,创建HttpPost对象,并设置请求URI

        2.创建json格式字符串,作为参数

        3.创建StringEntity对象,并将json格式参数传入,并指定类型为JSON

        4.绑定参数,处理响应

        5.获取……信息,关闭连接

        为了请求地址方便和结果展示,创建war工程并且编写控制器接收参数,注意:控制器参数要添加@RequestBody接收json格式字符串使参数可以转换为java对象


HttpClient工具类

import java.io.IOException;

import java.net.URI;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import org.apache.http.NameValuePair;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.CloseableHttpResponse;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.client.utils.URIBuilder;

import org.apache.http.entity.ContentType;

import org.apache.http.entity.StringEntity;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.message.BasicNameValuePair;

import org.apache.http.util.EntityUtils;

public class HttpClientUtil  {


public static String  doGet(String url, Map param) {

// 创建Httpclient对象

      CloseableHttpClient  httpclient = HttpClients.createDefault();

      String resultString = "  ";

      CloseableHttpResponse response =  null;

try {

// 创建uri

         URIBuilder builder  = new URIBuilder(url);

if (param != null) {

for (String key :  param.keySet()) {

  builder.addParameter(key, param.get(key));

            }

         }

         URI uri = builder.build();

// 创建http GET请求

         HttpGet httpGet = new HttpGet(uri);

// 执行请求

         response =  httpclient.execute(httpGet);

// 判断返回状态是否为200

         if (response.getStatusLine().getStatusCode()  == 200) {

            resultString = EntityUtils.toString(response.getEntity(),"UTF-8");

         }

      }

catch (Exception e) {

         e.printStackTrace();

      }

finally {

try {

if (response != null) {

               response.close();

            }

            httpclient.close();

         }

catch (IOException e) {

            e.printStackTrace();

         }

      }

return resultString;

   }


public static String  doGet(String url) {

return doGet(url, null);

   }


public static String  doPost(String url, Map param) {

// 创建Httpclient对象

      CloseableHttpClient  httpClient = HttpClients.createDefault();

      CloseableHttpResponse response =  null;

      String resultString =  "";

try {

// 创建Http Post请求

         HttpPost httpPost  =  new HttpPost(url);

// 创建参数列表

         if (param != null) {

            List  paramList =  new ArrayList<>();

for (String key : param.keySet())  {

               paramList.add(  new BasicNameValuePair(key,  param.get(key)));

            }


// 模拟表单

            UrlEncodedFormEntityentity = new UrlEncodedFormEntity(paramList,"utf-8");

            httpPost.setEntity(entity);

         }


// 执行http请求

         response =  httpClient.execute(httpPost);

         resultString = EntityUtils.toString(response.getEntity(),"utf-8");

      }

catch (Exception e) {

         e.printStackTrace();

      }

finally {

try {

            response.close();

         }

catch (IOException e) {

// TODO Auto-generated catch block

            e.printStackTrace();

         }

      }

return resultString;

   }


public static String  doPost(String url) {

return doPost(url, null);

   }



public static String  doPostJson(String url, String json) {

// 创建Httpclient对象

      CloseableHttpClient  httpClient = HttpClients.createDefault();

      CloseableHttpResponse response =  null;

      String resultString =  "";

try {

// 创建Http Post请求

         HttpPost httpPost  = new HttpPost(url);

// 创建请求内容

         StringEntityentity = new StringEntity(json,ContentType.APPLICATION_JSON);

         httpPost.setEntity(entity);

// 执行http请求

         response =  httpClient.execute(httpPost);

         resultString = EntityUtils.toString(response.getEntity(),"utf-8");

      }

catch (Exception e) {

         e.printStackTrace();

      }

finally {

try {

            response.close();

         }

catch (IOException e) {

// TODO Auto-generated catch block

            e.printStackTrace();

         }

      }

return resultString;

   }

}



你可能感兴趣的:(JsonP、跨域、HttpClient)