java httpclient 跨域_使用Httpclient 完美解决服务端跨域问题

本文介绍了如何使用Java HttpClient在服务端解决跨域问题。通过在同一个系统的后台使用HttpClient请求不同端口的服务,避免了传统的客户端跨域限制。示例展示了在两个不同端口的Maven项目间,如何通过HttpClient实现数据交互。总结了HttpClient与jsonp在跨域访问上的区别。
摘要由CSDN通过智能技术生成

项目需求:

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工作图解:

20a1401104852b5a2df094cc92df8a17.png

核心代码展示:

(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格式的数据。

c3cc1adb5f7d22fe1076f64c131bf2ea.png

总结:

HttpClient与Jsonp能够轻易的解决跨域问题,从而得到自己想要的数据(来自不同IP,协议,端口),唯一的不同点是,HttpClient是在Java代码中进行跨域访问,而Jsonp是在js中进行跨域访问。跨域还有一级跨域,二级跨域,更多内容值得研究。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值