项目需求:
jsonp是从前台js的角度考虑,通过Ajax调用springMVC的接口。同一个ip、同一个网络协议、同一个端口,三者都满足就是同一个域,否则就是跨域问题了。首页广告需要一个轮播的效果,取后台数据json格式。上篇博客介绍了使用jsonp来解决跨域,现在有个新的方法来解决,那就是:ajax请求地址改为自己系统的后台地址,之后在自己的后台用HttpClient请求url。封装好的跨域请求url工具类。封装一个get一个POST即可。
两者的区别就在于,jsonp是基于客户端的跨域解决。而httpclient是基于服务端的跨域解决。
我现在有两个maven项目:
Taotao-portal(8082端口)
Taotao-rest(8081端口)
要使用httpclient需要在maven中引用(portal):
org.apache.httpcomponents
httpclient
org.apache.httpcomponents
httpclient
rest项目中写了个后台的服务调广告的数据,在portal项目中的service层来调用rest项目中的controller层提供的服务。
httpclient工作图解:
核心代码展示:
(portal项目)contentcontroller.java
@Controller
publicclassContentController {
@Autowired
privateContentService contentService;
//getdata
@RequestMapping("/content/{cid}")
@ResponseBody
publicTaotaoResult getConentList(@PathVariableLong cid){
try{
List list=contentService.getContentList(cid);
returnTaotaoResult.ok(list);
} catch(Exception e) {
e.printStackTrace();
returnTaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
}
}
}@Controller
public class ContentController {
@Autowired
private ContentService contentService;
//getdata
@RequestMapping("/content/{cid}")
@ResponseBody
public TaotaoResult getConentList(@PathVariable Long cid){
try {
List<TbContent> list=contentService.getContentList(cid);
return TaotaoResult.ok(list);
} catch (Exception e) {
e.printStackTrace();
return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
}
}
}
(portal项目)HttpClientUtil.java
packagecom.taotao.common.utils;
importjava.io.IOException;
importjava.net.URI;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.Map;
importorg.apache.http.NameValuePair;
importorg.apache.http.client.entity.UrlEncodedFormEntity;
importorg.apache.http.client.methods.CloseableHttpResponse;
importorg.apache.http.client.methods.HttpGet;
importorg.apache.http.client.methods.HttpPost;
importorg.apache.http.client.utils.URIBuilder;
importorg.apache.http.entity.ContentType;
importorg.apache.http.entity.StringEntity;
importorg.apache.http.impl.client.CloseableHttpClient;
importorg.apache.http.impl.client.HttpClients;
importorg.apache.http.message.BasicNameValuePair;
importorg.apache.http.util.EntityUtils;
publicclassHttpClientUtil {
publicstaticString doGet(String url, Map param) {
// 创建Httpclient对象
CloseableHttpClient httpclient = HttpClients.createDefault();
String resultString = "";
CloseableHttpResponse response = null;
try{
// 创建uri
URIBuilder builder = newURIBuilder(url);
if(param !=null) {
for(String key : param.keySet()) {
builder.addParameter(key, param.get(key));
}
}
URI uri = builder.build();
// 创建http GET请求
HttpGet httpGet = newHttpGet(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();
}
}
returnresultString;
}
publicstaticString doGet(String url) {
returndoGet(url,null);
}
publicstaticString doPost(String url, Map param) {
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try{
// 创建Http Post请求
HttpPost httpPost = newHttpPost(url);
// 创建参数列表
if(param !=null) {
List paramList = newArrayList<>();
for(String key : param.keySet()) {
paramList.add(newBasicNameValuePair(key, param.get(key)));
}
// 模拟表单
UrlEncodedFormEntity entity = newUrlEncodedFormEntity(paramList);
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();
}
}
returnresultString;
}
publicstaticString doPost(String url) {
returndoPost(url,null);
}
publicstaticString doPostJson(String url, String json) {
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try{
// 创建Http Post请求
HttpPost httpPost = newHttpPost(url);
// 创建请求内容
StringEntity entity = newStringEntity(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();
}
}
returnresultString;
}
}package com.taotao.common.utils;
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<String, String> 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<String, String> param) {
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post请求
HttpPost httpPost = new HttpPost(url);
// 创建参数列表
if (param != null) {
List<NameValuePair> paramList = new ArrayList<>();
for (String key : param.keySet()) {
paramList.add(new BasicNameValuePair(key, param.get(key)));
}
// 模拟表单
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
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);
// 创建请求内容
StringEntity entity = 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;
}
}
(rest项目)contentserviceimpl.java
@Service
publicclassContentServiceImplimplementsContentService {
//service 写活,读配置文件
@Value("${REST_BASE_URL}")
privateString REST_BASE_URL;
@Value("${REST_CONTENT_URL}")
privateString REST_CONTENT_URL;
@Value("${REST_CONTENT_AD1_CID}")
privateString REST_CONTENT_AD1_CID;
@Override
publicString getAd1List() {
//调用服务获得数据 跨域请求:http://localhost:8081/content/89
String json = HttpClientUtil.doGet(REST_BASE_URL + REST_CONTENT_URL + REST_CONTENT_AD1_CID);
//把json转换成java对象
TaotaoResult taotaoResult = TaotaoResult.formatToList(json, TbContent.class);
//取data属性,内容列表
List contentList = (List) taotaoResult.getData();
//把内容列表转换成AdNode列表
List resultList = newArrayList<>();
for(TbContent tbContent : contentList) {
AdNode node = newAdNode();
node.setHeight(240);
node.setWidth(670);
node.setSrc(tbContent.getPic());
node.setHeightB(240);
node.setWidthB(550);
node.setSrcB(tbContent.getPic2());
node.setAlt(tbContent.getSubTitle());
node.setHref(tbContent.getUrl());
resultList.add(node);
}
//需要把resultList转换成json数据
String resultJson = JsonUtils.objectToJson(resultList);
returnresultJson;
}
}@Service
public class ContentServiceImpl implements ContentService {
//service 写活,读配置文件
@Value("${REST_BASE_URL}")
private String REST_BASE_URL;
@Value("${REST_CONTENT_URL}")
private String REST_CONTENT_URL;
@Value("${REST_CONTENT_AD1_CID}")
private String REST_CONTENT_AD1_CID;
@Override
public String getAd1List() {
//调用服务获得数据 跨域请求:http://localhost:8081/content/89
String json = HttpClientUtil.doGet(REST_BASE_URL + REST_CONTENT_URL + REST_CONTENT_AD1_CID);
//把json转换成java对象
TaotaoResult taotaoResult = TaotaoResult.formatToList(json, TbContent.class);
//取data属性,内容列表
List<TbContent> contentList = (List<TbContent>) taotaoResult.getData();
//把内容列表转换成AdNode列表
List<AdNode> resultList = new ArrayList<>();
for (TbContent tbContent : contentList) {
AdNode node = new AdNode();
node.setHeight(240);
node.setWidth(670);
node.setSrc(tbContent.getPic());
node.setHeightB(240);
node.setWidthB(550);
node.setSrcB(tbContent.getPic2());
node.setAlt(tbContent.getSubTitle());
node.setHref(tbContent.getUrl());
resultList.add(node);
}
//需要把resultList转换成json数据
String resultJson = JsonUtils.objectToJson(resultList);
return resultJson;
}
}
(rest项目)indexcontroller
@Autowired
privateContentService contentService;
@RequestMapping("/index")
publicString showIndex(Model model){
String json=contentService.getAd1List();
model.addAttribute("ad1",json);
return"index";
}@Autowired
private ContentService contentService;
@RequestMapping("/index")
public String showIndex(Model model){
String json=contentService.getAd1List();
model.addAttribute("ad1",json);
return "index";
}
查看网页源代码,可以看到传过来的json格式的数据。
总结:
HttpClient与Jsonp能够轻易的解决跨域问题,从而得到自己想要的数据(来自不同IP,协议,端口),唯一的不同点是,HttpClient是在Java代码中进行跨域访问,而Jsonp是在js中进行跨域访问。跨域还有一级跨域,二级跨域,更多内容值得研究。