跨域:ip|域名|端口号-不同称为跨域
js在项目中不能使用ajax直接调用外部的服务的
跨域加载可以,跨域请求数据不行
前端跨域
方式一
1.abc(某){某在方法里相当于json,即跨域请求的json};
2.$.getJSONP(url);//url地址=www.xxx.cn?xx=abc
3.Controller里
第一种--返回的
@RequestMapping(value="/test",produces=MediaType.APPLICATION_JSON_VALUE+";charset=utf-8")
//解决json乱码问题
@ResponseBody
private String getList(String xx){
if(StringUtils.isBlank(xx)){//lang3
//xx为空直接返回json(String)
}
return xx+"("+json(要为String)+")";
}
请求接口后接收abc(json数据),会执行,abc函数,参为接收的json
第二种--即jsonp返回[abc(json数据即fff)]
springmvc要为4.1版本以上
url地址=www.xxx.cn/check/par/typ?xx=abc
@RequestMapping("/check/{param}/{type}")
@ResponseBody
public Object checkData(@PathVariable String param, @PathVariable Integer type, String xx) {
try {
//此处获取数据库数据赋给fff
//当用户传递参aaa不为空,表请求的数据为jsonp数据--跨域用的,为空表是自己调用直接返回json
if (StringUtils.isNotBlank(xx)) {
//请求为jsonp调用,需要支持
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(fff(可任意类型如类Map等));
mappingJacksonValue.setJsonpFunction(xx);
return mappingJacksonValue;//返回jsonp
}
return fff;//返回json
} catch (Exception e) {
e.printStackTrace();
return Helper.exceptionToString(e);
}
}
第一种与第二种一个意思
猜当2执行,再3返回数据,此时1的方法运行
方式2 jsonp
示例书<<从零开始写Java Web框架>>前端跨域P305
后端跨域
httpClient是用在java里server层
示例
PayCost cost=new PayCost();
cost.setPhoneNo(phoneNo);
cost.setPkgNo(pkgNo);
cost.setTimeStamp(Helper.dateToString(new Date(), "yyyyMMddHHmmss"));
String appSecret=cost.getAppSecret();
String action=cost.getAction();
//System.out.println("?"+action);
String appKey=cost.getAppKey();
String phoneNoo=cost.getPhoneNo();
String pkgNoo=cost.getPkgNo();
String backUrl=Helper.getBASE64("http://www.perai.cn:8181/tra_top_up/returnCallTraffic");
String transNo=Helper.dingdanId();
String timeStamp=cost.getTimeStamp();
String sign=appSecret+"action"+action+"appKey"+appKey+"backUrl"+backUrl+"phoneNo"+phoneNoo+
"pkgNo"+pkgNoo+"timeStamp"+timeStamp+"transNo"+transNo+appSecret;
//System.out.println("sign---"+sign);
sign=(Helper.nvlString(Helper.SHA1(sign))).toUpperCase();
cost.setSign(sign);
//System.out.println("sign---"+sign);
Map<String, String> param=new HashMap<String, String>();
param.put("action",action);
param.put("appKey",appKey);
param.put("backUrl",backUrl);
param.put("phoneNo",phoneNoo);//手机号
param.put("pkgNo",pkgNoo); //流量包类型
param.put("timeStamp",timeStamp);
param.put("transNo",transNo);//客户端交易号
param.put("sign",sign);
//System.out.println(param);
String doPost = Helper.doPost("http://61.50.245.230:81/flowAgent", param); //参1是地址,参2是请求参数的Map集
Map stringJSONToMap = Helper.StringJSONToMap(doPost);
String orderId=(String) stringJSONToMap.get("orderId");//对方唯一码
String respCode=(String) stringJSONToMap.get("respCode");//响应码描述
Trafficrecordyh trafficrecordyh=new Trafficrecordyh();
trafficrecordyh.setDatetime(new Date());
trafficrecordyh.setOrderid(orderId);
trafficrecordyh.setRespcode(respCode);
trafficrecordyh.setPhoneno(phoneNoo);
trafficrecordyh.setTransno(transNo);
trafficrecordyh.setPkgno(pkgNoo+"信息");
trafficrecordyhMapper.insertSelective(trafficrecordyh);
return doPost;
doPostYKY 方法是不需要引什么jar包的
doPost 与 doPostJSON 的区别:参不一样
这三种方式都行
使不会产生跨域
方式1:用CORS
spring配置,如下地址不会导致跨域
<mvc:cors>
<mvc:mapping path="/da_rev/**"
allowed-origins="http://192.168.0.194:8181"
allowed-methods="GET, POST"
allowed-headers="*"
exposed-headers=""
allow-credentials="false"
max-age="3600" />
<mvc:mapping path="/jiekou"
allowed-origins="http://192.168.0.194:8181" />
</mvc:cors>
<mvc:cors报找不着,解决:最上面那块改为 http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
方式2:用nginx //基本使用可见
listen 80;
server_name www.nzxxx.cn;
location / {
root /Users/xxx/ideaProjects/webtest/dist; //静态地址指向 http://www.nzxxx.cn:80/aa.html 会访问 /Users/xxx/ideaProjects/webtest/dist/aa.html
index index.html;
# 此处用于处理 Vue、Angular、React 使用H5 的 History时 重写的问题
if (!-e $request_filename) {
rewrite ^(.*) /index.html last;
break;
}
}
# 代理服务端接口
location /api/ { //猜可此行不一样,如下地址也不一样,实现多个后台的代理
proxy_pass http://www.nzxxx.cn:8080/;
}
//后台项目用8080启动,前台的 http://www.nzxxx.cn:80/api/aa 实则访问 http://www.nzxxx.cn:8080/aa 这样前端项目(80)就不会因为端口(后台8080)导致跨域