(0)使用注解方式,这个可能有些框架可以,有些不行,在要访问的方法前面加上此注解即可:

@CrossOrigin

(1)使用 Access-Control-Allow-Origin 设置请求响应头,简洁有效。

 (后台)被请求的方法,设置请求响应头:

response.setHeader("Access-Control-Allow-Origin","*"); //response 来自 HttpServletResponse

 (前端)前端js的ajax中,数据类型使用json,不能使用 “jsonp” //自己一开始就是写成 jsonp,结果半天不起作用

dataType : "json",

 【当然最好的方法是写一个过滤器,不要在每个被请求的方法里面都添加这句,如果写过滤器的话,doFilter() 方法中参数 response 类型为 ServletResponse,需要强转成 HttpServletResponse 类型,才可以设置 setHeader() 请求头】

(2)使用 httpClient 做后台中转,避开前端跨域问题。

 1、创建 httpClient 工具类(可以直接复制使用,修改一下包名路径即可)

package 自己包名路径;import java.io.IOException;import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
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.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.alibaba.fastjson.JSONObject;public class HttpClientUtils {private static Logger logger = LoggerFactory.getLogger(HttpClientUtils.class); // 日志记录private static RequestConfig requestConfig = null;static {// 设置请求和传输超时时间requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build();}/*** post请求传输json参数* * @param url*            url地址* @param json*            参数* @return*/public static JSONObject httpPost(String url, JSONObject jsonParam) {// post请求返回结果CloseableHttpClient httpClient = HttpClients.createDefault();JSONObject jsonResult = null;HttpPost httpPost = new HttpPost(url);// 设置请求和传输超时时间
        httpPost.setConfig(requestConfig);try {if (null != jsonParam) {// 解决中文乱码问题StringEntity entity = new StringEntity(jsonParam.toString(), "utf-8");entity.setContentEncoding("UTF-8");entity.setContentType("application/json");httpPost.setEntity(entity);}CloseableHttpResponse result = httpClient.execute(httpPost);// 请求发送成功,并得到响应if (result.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String str = "";try {// 读取服务器返回过来的json字符串数据str = EntityUtils.toString(result.getEntity(), "utf-8");// 把json字符串转换成json对象jsonResult = JSONObject.parseObject(str);} catch (Exception e) {logger.error("post请求提交失败:" + url, e);}}} catch (IOException e) {logger.error("post请求提交失败:" + url, e);} finally {httpPost.releaseConnection();}return jsonResult;}/*** post请求传输String参数 例如:name=Jack&sex=1&type=2* Content-type:application/x-www-form-urlencoded* * @param url*            url地址* @param strParam*            参数* @return*/public static JSONObject httpPost(String url, String strParam) {// post请求返回结果CloseableHttpClient httpClient = HttpClients.createDefault();JSONObject jsonResult = null;HttpPost httpPost = new HttpPost(url);httpPost.setConfig(requestConfig);try {if (null != strParam) {// 解决中文乱码问题StringEntity entity = new StringEntity(strParam, "utf-8");entity.setContentEncoding("UTF-8");entity.setContentType("application/x-www-form-urlencoded");httpPost.setEntity(entity);}CloseableHttpResponse result = httpClient.execute(httpPost);// 请求发送成功,并得到响应if (result.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String str = "";try {// 读取服务器返回过来的json字符串数据str = EntityUtils.toString(result.getEntity(), "utf-8");// 把json字符串转换成json对象jsonResult = JSONObject.parseObject(str);} catch (Exception e) {logger.error("post请求提交失败:" + url, e);}}} catch (IOException e) {logger.error("post请求提交失败:" + url, e);} finally {httpPost.releaseConnection();}return jsonResult;}/*** 发送get请求* * @param url*            路径* @return*/public static JSONObject httpGet(String url) {// get请求返回结果JSONObject jsonResult = null;CloseableHttpClient client = HttpClients.createDefault();// 发送get请求HttpGet request = new HttpGet(url);request.setConfig(requestConfig);try {CloseableHttpResponse response = client.execute(request);// 请求发送成功,并得到响应if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {// 读取服务器返回过来的json字符串数据HttpEntity entity = response.getEntity();String strResult = EntityUtils.toString(entity, "utf-8");// 把json字符串转换成json对象jsonResult = JSONObject.parseObject(strResult);} else {logger.error("get请求提交失败:" + url);}} catch (IOException e) {logger.error("get请求提交失败:" + url, e);} finally {request.releaseConnection();}return jsonResult;}
}

2、在A项目下新建中转类,添加中转方法(其实就是一个controller类,注意注解使用 @RestController ,使用 @Controller 会取不到数据)

package 自己包名路径;import java.util.HashMap;
import java.util.Map;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import com.alibaba.fastjson.JSONObject;
import com.chang.util.HttpClientUtils;@RestController
public class Azhong {   //中转方法@RequestMapping("/forwardB")public Map<String,Object> forwardB() {System.out.println("进来A的中转站了");JSONObject jb = HttpClientUtils.httpGet("要访问的B项目的方法的路径");

     //下面是自己具体的业务处理,这里只是demo测试Map<String, Object> map = new HashMap<String, Object>();map.put("retCode", jb.get("retCode").toString());map.put("retMsg", jb.get("retMsg").toString());return map;}
}

3、前端 ajax 的 url : "http://A项目路径/forwardB", 数据类型 dataType : "json"

url : "http://A项目路径/forwardB", //访问自己的中转方法dataType : json

转载于:https://www.cnblogs.com/xuehuashanghe/p/9687066.html

解决“跨域问题”的几种方法相关推荐

  1. 解决跨域请求的四种方法

    跨域 跨域就是请求的url中的"协议"."域名"."端口号"其中任何一种不一样都是属于跨域.解决跨域的主要的四种方法是jsonp.跨域资源共 ...

  2. 解决跨域问题的三种方法

    出于安全问题考虑, 都会有跨域限制, 你都不想浏览器在和你的服务器交互时还和别的服务器有联系吧(就好像默认不允许第三者插足). 但如果当前正在交互的服务器都同意了, 那么跨域也就没问题了(一方有这个想 ...

  3. [转] js前端解决跨域问题的8种方案(最新最全)

    [转] js前端解决跨域问题的8种方案(最新最全) 参考文章: (1)[转] js前端解决跨域问题的8种方案(最新最全) (2)https://www.cnblogs.com/chris-oil/p/ ...

  4. 前端解决跨域问题的8种方案(最新最全)

    .同源策略如下: URL 说明 是否允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.j ...

  5. 前端解决跨域问题的8种方案

    2019独角兽企业重金招聘Python工程师标准>>> 1.同源策略如下: URL 说明 是否允许通信 http://www.a.com/a.js http://www.a.com/ ...

  6. AJAX异步请求解决跨域问题的三种方式

    一 什么是跨域 出于浏览器的同源策略限制.同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说We ...

  7. Spring Boot 解决跨域问题的 3 种方案!

    以下文章来源方志朋的博客,回复"666"获面试宝典 作者:telami 来源:www.telami.cn/2019/springboot-resolve-cors/ 前后端分离大势 ...

  8. Spring Boot 解决跨域问题的 3 种方案

    来源 | r6d.cn/XTrB 前后端分离大势所趋,跨域问题更是老生常谈,随便用标题去google或百度一下,能搜出一大片解决方案,那么为啥又要写一遍呢,不急往下看. 问题背景: Same Orig ...

  9. 前端解决跨域问题(9个方法)

    什么是跨域? 跨域,是指浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制. 这里说明一下,无法跨域是浏览器对于用户安全的考虑,如果自己写个没有同 ...

最新文章

  1. Draw Circle 沿着圆运动~~
  2. elasticsearch 运行原理
  3. Windows7 Home高级 64 中文版 + TortoiseSVN 64 英文版 + SVN Server 32 英文版安装过程
  4. Python编程基础:第十八节 字典Dictionaries
  5. 6.6.1 CPropertySheet类
  6. Xshell修改颜色(xshell配色)
  7. background-attachment:fixed应用
  8. LeetCode 239. Sliding Window Maximum
  9. 欧拉函数 cojs 2181. 打表
  10. 程序员提高建议之踏踏实实“扎马步”
  11. 笔记本连接显示器后没有声音_电脑用HDMI外界显示器后,没有声音
  12. 活跃用户数怎么计算_【数据运营】|如何做好活跃用户的运营?
  13. 疯传社群源码v7.8.0 测试可用 修复绿色版
  14. Ext自定义控件 - 自学ExtJS
  15. 《构建高可用Linux服务器》答读者疑问
  16. Linux 权限设置
  17. Ubuntu16.04 安装Firefox火狐浏览器中国版使用及升级
  18. 作为管理者,就不要总等着领导给你布置任务了
  19. win用html设置桌面,教你设置Win10系统炫酷桌面的三个技巧
  20. html图像css设置大小,关于html:CSS显示调整大小和裁剪的图像

热门文章

  1. n个数分为m堆有多少种分法(青岛理工邀请赛)动态规划
  2. WSDM 2022 | 一种用于在线广告自动竞价的协作竞争多智能体框架
  3. 显示此文稿缺少字体_打开CAD图纸后,显示缺少SHX文件?这个解决方法你一定要知道...
  4. PAT_B_1025_Java(22分)
  5. go python java_一文助你搞懂参数传递原理解析(java、go、python、c++)
  6. 数学--数论--欧拉降幂--P5091 欧拉定理
  7. 开源Easydarwin流媒体服务器Windows编译、配置、部署
  8. quartus将modelsim,synplify和quartus联合起来使用进行的FPGA设计(转)
  9. 基于ZooKeeper的分布式Session实现
  10. SQL查询中having和where的异同点