一、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;
}
}