java代码怎么解决跨域 java跨域解决方案

跨域产生的原因和解决方法因为浏览器的同源政策,就会产生跨域 。比如说发送的异步请求是不同的两个源,就比如是不同的的两个端口或者不同的两个协议或者不同的域名 。由于浏览器为了安全考虑,就会产生一个同源政策,不是同一个地方出来的是不允许进行交互的 。
解决跨域的方法:
1、通过jsonp跨域 。
2、通过修改document.domain来跨子域 。
3、使用window.name来进行跨域 。
4、使用HTML5中新引进的window.postMessage方法来跨域传送数据 。
5、使用代理服务器,使用代理方式跨域更加直接,因为同源限制是浏览器实现的 。如果请求不是从浏览器发起的 , 就不存在跨域问题了 。
跨域的特点:
1、跨域只存在于浏览器,不在浏览器发请求是不会存在跨域问题的 。
2、跨域是出现在ajax请求中,普通请求不会 。
3、所有的跨域 , 都必须经过服务端的允许和配合,未经server端的允许和配合就实现跨越 , 说明浏览器有漏洞 , 不安全 。
以上内容参考百度百科-跨域网络
跨域怎么解决问题一:如何解决跨域问题特别注意两点:
第一 , 如果是协议和端口造成的跨域问题“前台”是无能为力的 ,
第二:在跨域问题上 , 域仅仅是通过“URL的首部”来识别而不会去尝试判断相同的ip地址对应着两个域或两个域是否在同一个ip上 。
“URL的首部”指window.location.protocolwindow.location.host,也可以理解为“Domains, protocols and ports must match” 。
2. 前端解决跨域问题
1 document.domainiframe (只有在主域相同的时候才能使用该方法)
1) 在a/a中:
复制代码
document.domain = 'a';
var ifr = document.createElement('iframe');
ifr.src = 'https://www.04ip.com/post/script.a/b';
ifr.display = none;
document.body.appendChild(ifr);
ifr.onload = function(){
var doc = ifr.contentDocument || ifr.contentWindow.document;
在这里操作doc,也就是b
ifr.onload = null;
};
复制代码
2) 在script.a/b中:
document.domain = 'a';
2 动态创建script
这个没什么好说的,因为script标签不受同源策略的限制 。
复制代码
function loadScript(url, func) {
var head = document.head || document.getElementByTagName('head')[0];
var script = document.createElement('script');
script.src = https://www.04ip.com/post/url;
script.onload = script.onreadystatechange = function(){
if(!this.readyState || this.readyState=='loaded' || this.readyState=='plete'){
func();
script.onload = script.onreadystatechange = null;
}
};
head.insertBefore(script......
问题二:如何解决跨域问题由 于此前很少写前端的代码(哈哈,不合格的程序员啊),最近项目中用到json作为系统间交互的手段,自然就伴随着众多ajax请求,随之而来的就是要解决 ajax的跨域问题 。本篇将讲述一个小白从遇到跨域不知道是跨域问题,到知道是跨域问题不知道如何解决,再到解决跨域问题,最后找到两种方法解决ajax 跨域问题的全过程 。
不知是跨域问题
起 因是这样的,为了复用,减少重复开发,单独开发了一个用户权限管理系统 , 共其他系统获取认证与授权信息 , 暂且称之为A系统;调用A系统以B为例 。在B系统 中用ajax调用A系统系统的接口(数据格式为json),当时特别困惑,在A系统中访问相应的url可正常回返json数据 , 但是在B系统中使用 ajax请求同样的url则一点儿反应都没有,好像什么都没有发生一样 。这样反反复复改来改去好久都没能解决,于是求救同事,提醒可能是ajax跨域问 题,于是就将这个问题当做跨域问题来解决了 。
知跨域而不知如何解决
知道问题的确切原因,剩下的就是找到解决问题的方法了 。google了好久 , 再次在同事的指点下知道jQuery的ajax有jsonp这样的属性可以用来解决跨域的问题 。
找到一种解决方式
现在也知道了怎样来解决跨域问题,余下的就是实现的细节了 。实现的过程中错误还是避免不了的 。由于不了解json和jsonp两种格式的区别,也犯了错误,google了好久才解决 。
首先来看看在页面中如何使用jQuery的ajax解决跨域问题的简单版:
复制代码
$(document).ready(function(){
var url='localhost:8080/...upById
?id=1callback=?';
$.ajax({
url:url,
dataType:'jsonp',
processData: false,
type:'get',
success:function(data){
alert(data.name);
},
error:function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}});
});
复制代码
这样写是完全没有问题的 , 起先error的处理函数中仅仅是alert(“error”),为了进一步弄清楚是什么原因造成了错误,故将处理函数变 为上面的实现方式 。最后一行alert使用为;parsererror 。百思不得其解,继续google,最终还是在万能的stackoverflow找 到了答案,链接在这里 。原因是jsonp的格式与json格式有着细微的差别,所以在server端的代码上稍稍有所不同 。
比较一下json与jsonp格式的区别:
json格式:
{
messageq......
问题三:跨域是指什么,因为什么引起的?有哪些解决方案?web前端知识跨域是指 不同域名之间相互访问 例如 我的电脑上有2个服务器 192.168.0.11 192.168.0.12 如果第一个服务器上的页面要访问第二个服务器 就叫做跨域 或者baidu 要访问xxx 也是不同域名 也是跨域
HTML5 里有个window.postMessage 方法,支持跨域访问,详情可以参考
webhek/window-postmessage-api
如果你的程序在服务器上,也可以进行相应的操作来完成跨域访问
纯手打 有问题欢迎咨询
问题四:如何解决跨域问题打开IE浏览器,在工具菜单下选择Internet选项,打开Internet选项卡
切换到安全选项卡下,点击可信站点,然后单击站点按钮
可信站点窗口输入网址到可信站点的区域 , 点击添加按钮,网址则会添加到网站列表下,最后关闭可信站点窗口
还是在安全选项卡下的可信站点 , 点击自定义级别
打开受信任的站点区域窗口 , 找到跨域浏览窗口和框架选择启用
在当前窗口中继续往下翻 , 通过域访问数据源也选择启用,点击确定关闭受信任的站点区域窗口
在Internet窗口也点击确定按钮,同时关闭浏览器
在请求的js脚本中添加是否允许跨域访问的权限,jQuery.support.cors默认值为true,则代表允许;反之 , 不允许 。设置完成,重新打开浏览器验证即可
问题五:$跨域请求怎么解决post请求进行跨域
angularjs内置封装了类ajax的网络服务$,所以实现了依赖外部插件来完成完整的前后端分离方案
$scope.main = {
getData: function () {
$({
method: 'POST',
url: 'localhost:8000',
headers: {
'Content-Type' : 'application/x--form-urlencoded'
},
data: {
myUrl: 'c.m.163/...0'
}
}).then(function success(result) {
数据请求成功
console.log(result.data);
},function error(err) {
数据请求失败
console.log(err);
});
}
};
注意:表面上是向$中传入了一个回调函数提供相应时调用 , 实际是返回了一个promise对象,angular1.2以上的版本对$进行了优化
优化后:
$scope.main = {
getData: function () {
var myUrl = 'c.m.163/...0';
var url = 'localhost:8000';
var promise = $({
method: 'POST',
url: url,
headers: {
'Content-Type' : 'text/plain'
......
问题六:如何解决跨域问题关于跨域名问题还是问题么 , 这方面的解决实践非常多 , 今天我就旧话重提把我所知道的通过几个应用场景来分别总结一下(转帖请注明出处:blog.csdn/lenel)
先说明一点:我说的某某域名在您的控制下的意思是这个域名下的网页由您来负责开发内部的JavaScript
场景一:将bbs.xxx的页面用iframe嵌入到xxx的中,如何在iframe内外使用js通信(转帖请注明出处:blog.csdn/lenel)
一级域名都是xxx 这个域名一定是在您的控制下,所以你只要在两个页面中同时升级域名即可
在父窗口和iframe内部分别加上js语句:document.domain=xxx;
之后2个页面就等于在同一域名下,通过window.parent oIframe.contentDocument就可以相互访问,进行无障碍的JS通信
在新浪、淘宝等很多页面都能找到这样的语句 。不过document.domain不可以随便指定,只能向上升级,从bbs.xxx升级到yyy肯定会出错
场景二:将yyy的页面用iframe嵌入到xxx的中 , 两个域名都在您的控制下,如何在iframe内外进行一定的数据交流(转帖请注明出处:blog.csdn/lenel)
你可以通过相互改变hash值的方式来进行一些数据的通信
这里的实现基于如下技术要点:
1、父窗口通过改变子窗口的src中的hash值把一部分信息传入,如果src只有hash部分改变,那么子窗口是不会重新载入的 。
2、
子窗口可以重写父窗口的location.href,但是注意这里子窗口无法读取而只能重写location.href所以要求前提是您控制两个域名,知
道当前父窗口的location.href是什么并写在子窗口内,这样通过parent.location.href =https://www.04ip.com/post/
已知的父窗口的href # hash 。这样父窗口只有hash改变也不会重载 。
3、上面两步分别做到了两个窗口之间的无刷新数据通知,
那么下面的来说如何感知数据变化 。标准中没有相关规定,所以当前的任意浏览器遇到location.hash变化都不会触发任何javaScript事
......
问题七:如何解决javascript的跨域问题一般是用iframe设置
document.domain = 'a';var ifr = document.createElement('iframe');ifr.src = 'https://www.04ip.com/post/a/index';ifr.style.display = 'none';document.body.appendChild(ifr);ifr.onload = function(){ var doc = ifr.contentDocument || ifr.contentWindow.document; console.log(doc.documentElement.innetHTML);};然后HTML5新特性有 ,postMessage
function Init () { if (window.addEventListener) { all browsers except IE before version 9 window.addEventListener (message, OnMessage, false); } else { if (window.attachEvent) { IE before version 9 window.attachEvent(onmessage, OnMessage); } } } function GetState () { var frame = document.getElementById (myFrame); var message = getstate;参数if (frame.contentWindow.postMessage) { 传递的参数,后面是传递的你的跨域域名frame.contentWindow.postMessage (message, *); } } function OnMessage (event) { console.log(event.data);} document.body.onload=function(){Init();GetState();};
问题八:如何解决跨域问题VPN或者域名
问题九:如何解决请求跨域的问题jsonp 是写 script 标签 , 只能满足 get 请求 。跨域 post 的话,IE8 及以上和其他主流浏览器可以用 window.postMessage 来实现,也就是传说中的 HTML5 方法了 , 可以看下标准,代码很简单 。IE6、7 就用老式的方法
问题十:怎么解决服务器间的跨域问题服务端的解决方案的基本原理就是 , 由客户端将请求发给本域服务器,再由本域服务器的代理来请求数据并将响应返回给客户端 。
最常用的服务器解决方案就是利用web服务器本身提供的proxy功能,如apache和ligd的mod_proxy模块 。在百度内 部,tran *** it的分流功能也可以解决部分跨域问题 。但这些方法都有一定的局限性,鉴于安全性等问题的考虑,space这边最后开发了一个专门用于处
理跨域请求代理服务的spproxy模块,用于彻底解决js跨域问题 。
下面我们将以空间的开放平台为例,简单介绍下如何通过apache的mod_proxy、tran *** it的分流以及space的spproxy模块来解
决该跨域问题,并简单介绍下spproxy的一些特性、缺点及下一步的改进计划 。
空间在展现每个UWA开放模块之前都必须请求该模块的xml源代码以进行解析,每个模块的源代码文件都是存放在act域下的/ow/uwa目录下,那么在
用户空间首页(hi域)中请求该xml文件时就会存在js跨域问题 。要解决该问题 , 只能让js向hi域的web服务器请求xml文件,而hi域web服务
器则通过一定的代理机制(如mod_proxy、tran *** it分流、spproxy)向act域的web服务器请求文件
java为什么会有跨域问题前言
相信大家在写前端脚本的时候经常会遇到发送数据到后台的情况 , 但是由于浏览器的限制,不同域名之间的数据是不能互相访问的,那前端怎么和后端如何进行数据之间的交换呢?
JavaScript由于安全性方面的考虑,不允许页面跨域调用其他页面的对象,那么问题来了 , 什么是跨域问题?
答:这是由于浏览器同源策略的限制,现在所有支持JavaScript的浏览器都使用了这个策略 。那么什么是同源呢?所谓的同源是指三个方面“相同”:
域名相同
协议相同
端口相同
下面就举几个例子来帮助更好的理解同源策略 。
URL
说明
是否允许通信
同一域名允许
不同域名不允许
同一域名不同端口不允许
同一域名不同协议不允许
在JAVA中处理跨域问题 , 通常有以下两种常用的解决方法 。
第一种解决方法
后台代码在被请求的Servlet中添加Header设置:
response.setHeader("Access-Control-Allow-Origin", "*");
PrintWriter out =null;
try
{
out = response.getWriter();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
out.print("{'status':'ok'}");
out.flush();
out.close();
Access-Control-Allow-Origin这个Header在W3C标准里用来检查该跨域请求是否可以被通过,如果值为*则表明当前页面可以跨域访问 。默认的情况下是不允许的 。
在前端JS中需要向Servlet发出请求,请求代码如下所示:
$.ajax({
url: "your url",
type:"get or post",
dataType:"json",
data:{
....
},
success:function(data){
...
}
第二种解决方法
通过jsonp跨域请求的方式 。JSONP和JSON虽然只有一个字母的区别,但是他们完全就是两回事,很多人很容易把他们搞混 。JSON是一种数据交换的格式,而JSONP则是一种非官方跨域数据交互协议 。
首先来说一下前端JS是怎么发送请求 。代码如下所示:
$.ajax({
url:"your url",
type:"get or post",
async:false,
dataType : "jsonp",
//服务端用于接收callback调用的function名的参数
jsonp:"callbackparam",
//callback的function名称
jsonpCallback:"success_jsonpCallback",
success:function(data){
console.log(data);
},
error:function(data){
console.log(data);
}
});
这里的callbackparam和success_jsonpCallback可以理解为发送的data数据的键值对,可以自定义 , 但是callbackparam需要和后台约定好参数名称,因为后台需要获取到这个参数里面的值(即success_jsonpCallback) 。
下面,最重要的来了,后台怎么样获取和返回数据呢 。代码如下所示:
PrintWriter out =null;
String callback=req.getParameter("callbackparam");
String json=callback "({'status':'ok'})";
try
{
out = resp.getWriter();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
out.print(json);
out.flush();
out.close();
首先需要获取参数名为callbackparam的值,这里获取到的值就是“success_jsonpCallback” 。然后将这个值加上一对小括号 。小括号里放入你需要返回的数据内容,比如这里我返回一个JSON对象 。当然你也可以返回其他对象,比如只返回一个字符串类型数据也可以 。最后前端JS返回的数据就是这样的:
success_jsonpCallback({'status':'ok'})
浏览器会自动解析为json对象,这时候你只需要在success回调函数中直接用data.status就可以了 。
Spring MVC 的跨域解决方案 一句话java代码怎么解决跨域:同一个ip、同一个网络协议、同一个端口 , 三者都满足就是同一个域,否则就是跨域 。
基于两个方面:
a. web应用本身是部署在不同java代码怎么解决跨域的服务器上
b.基于开发java代码怎么解决跨域的角度 --- 前后端分离
web应用本身是部署在不同的服务器上,对应的域名也就有所不同
比如百度 。
主域名:
二级域名:,,
需要在不同的域之间,通过ajax方式互相请求,是非常常见的需求 。
Spring 4中增加了对jsonp的原生支持,只需要ControllerAdvice就可以开启,方法如下:
首先新建一个Advice类,java代码怎么解决跨域我们叫做“JsonpAdvice” , 然后在里面定义接收jsonp请求的参数key:
@ControllerAdvice("cn.isy.web.sso.web")指定作用的包名
supper("callback")指定的是url中callback:
注意:
我们还可以重写AbstractJsonpResponseBodyAdvice中的feforeBodyWriteInternal方法:
做到实现url携带callback就返回jsonp格式,没有就返回正常格式
img
controller中
controller中的代码正常编写就OK,不用修改任何东西 。
只要保证在cn.isy.web.sso.web包下即可!
jquery ajax
注意:必须使用jsonp的方式提交请求!
有关cors的介绍可以去详细看一下 , 这里就不作重复了:
CORS详解
跨资源共享CORS详解
主要配置
使用注解CrossOrigin
在controller类上添加CrossOrigin注解表示当前类中的所有入口函数都
可以实现跨域 。也可以指定某个conroller中具体的方法 。
img
了解一下这个注解的内容:
img
jquery ajax的写法
注意:这里不用使用jsonp的方式请求普通的ajax即可?。?因为浏览器自己可以去做!
CORS全局配置
自己试了试没有成功!
资料
解释cors的原理不错
让自己变得更优秀才可以有更多资源
搜索微信号(ID:芋道源码),可以获得各种 Java 源码解析 。
并且,回复【书籍】后,可以领取笔者推荐的各种 Java 从入门到架构的书籍 。
后端解决前端跨域请求问题场景:前后端分离,页面和后端项目部署在不同服务器,出现请求跨域问题 。
原因:CORS:跨来源资源共享(CORS)是一份浏览器技术的规范,提供了 Web 服务从不同网域传来沙盒脚本的方法 , 以避开浏览器的同源策略,是 JSONP 模式的现代版 。与 JSONP 不同,CORS 除了 GET 要求方法以外也支持其他的 HTTP 要求 。用 CORS 可以让网页设计师用一般的 XMLHttpRequest , 这种方式的错误处理比JSONP要来的好,JSONP对于 RESTful 的 API 来说,发送 POST/PUT/DELET 请求将成为问题,不利于接口的统一 。但另一方面,JSONP 可以在不支持 CORS 的老旧浏览器上运作 。不过现代的浏览器(IE10以上)基本都支持 CORS 。
预检请求(option):在 CORS 中,可以使用 OPTIONS 方法发起一个预检请求(一般都是浏览检测到请求跨域时,会自动发起),以检测实际请求是否可以被服务器所接受 。预检请求报文中的 Access-Control-Request-Method 首部字段告知服务器实际请求所使用的 HTTP 方法;Access-Control-Request-Headers 首部字段告知服务器实际请求所携带的自定义首部字段 。服务器基于从预检请求获得的信息来判断,是否接受接下来的实际请求 。
解决方案:
1、创建一个过滤器,过滤options请求 。
package com.biz.eisp.sci.util;
import org.apache.commons.httpclient.HttpStatus;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 解决跨域问题
*
*/
public class CorsFilterimplements Filter {//filter 接口的自定义实现
public void init(FilterConfig filterConfig)throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpServletRequest request = (HttpServletRequest) servletRequest;
response.setHeader("Access-Control-Allow-Origin", "*");
if ("OPTIONS".equals(request.getMethod())){//这里通过判断请求的方法,判断此次是否是预检请求,如果是,立即返回一个204状态吗 , 标示,允许跨域;预检后 , 正式请求,这个方法参数就是我们设置的post了
response.setStatus(HttpStatus.SC_NO_CONTENT); //HttpStatus.SC_NO_CONTENT = 204
response.setHeader("Access-Control-Allow-Methods", "POST, GET, DELETE, OPTIONS, DELETE");//当判定为预检请求后 , 设定允许请求的方法
response.setHeader("Access-Control-Allow-Headers", "Content-Type, x-requested-with"); //当判定为预检请求后,设定允许请求的头部类型
response.addHeader("Access-Control-Max-Age", "1");// 预检有效保持时间
}
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
2、修改web.xml文件
filter
filter-namecors/filter-name
filter-classcom.biz.eisp.sci.util.CorsFilter/filter-class
/filter
filter-mapping
filter-namecors/filter-name
url-pattern/* /url-pattern
/filter-mapping
3、spring-mvc.xml添加HttpRequestHandlerAdapter http请求处理器适配器 。
HttpRequestHandlerAdapter作为HTTP请求处理器适配器仅仅支持对HTTP请求处理器的适配 。它简单的将HTTP请求对象和响应对象传递给HTTP请求处理器的实现,它并不需要返回值 。它主要应用在基于HTTP的远程调用的实现上 。
bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/
【java代码怎么解决跨域 java跨域解决方案】关于java代码怎么解决跨域和java跨域解决方案的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读