java跨域上传
A. 如何在java应用中跨域共享session,比如希
首先一点,你要明白session的大部分实现都是通过cookie的,所以跨域session是不可能的。
但跨域的认证还是可以有OAuth等实现方法,但不太推荐OAuth项目貌似烂尾了,随然大家都在用。
其次虽然跨域有点难,但放在同一域下的不同项目是可以共享session的,CAS也不算复杂,你可以上github搜一下redis-session这个项目,只有一个源代码文件,它给出了redis下session的一种nodejs实现,就是设置redis的超时来模拟session的超时。
再次,跨域也是可以的,就是使用iframe,在登录时,在多个域下同时写cookie,注意浏览器差异。
综上,你的想法完全可行。
B. “非”前后端分离javaweb项目,怎么使用nginx跨域
1:既然是别的api服务,那就建议你在jsp页面发起http请求去处理,不要用常用的ajax。
2:如果就用ajax,那可以看下jQuery封装下的ajax,有一个jsonp ,可以了解下。但是相对的可能api接口需要调整
3:nginx我暂时是没想到如何解决你说的问题。
C. java上传成功后怎么触发其他操作
java get方式异步上传_简述Java异步上传文件的三种方式 原创
2021-02-13 16:31:03
yi bbbian
码龄4年
关注
本文为大家分享了三种Java异步上传文件方式,供大家参考,具体内容如下
用第三方控件,如Flash,ActiveX等浏览器插件上传。
使用隐藏的iframe模拟异步上传。
使用XMLHttpRequest2来实现异步上传。
第一种使用浏览器插件上传,需要一定的底层编码功底,在这里我稿困就不讲了,以免误人子弟,提出这点大家可以自行网络。
第二种使用隐藏的iframe模拟异步上传。为什么在这里说的是模拟呢?因为我们其实是将返回结果放在了一个隐藏的iframe中,所以才没有使当前页面跳转,感觉就像是异步操作一样。
隐藏的iframe上传文件
附件:
正在上传...
// 上传完成后的回调
function uploadFinished(fileName) {
addToFlist(fileName);
loading(false);
}
function addToFlist(fname) {
var temp = ["
",
fname,
"删除",
"
"
];
$("#flist").append(temp.join(""));
}
function loading(showloading) {
if (showloading) {
$("#uptxt").show();
} else {
$("#uptxt").hide;
}
}
这基敬答种技术有两个关键的地方:
1.form会指定target,提交的结果定向返回到隐藏的ifram中。(即form的target与iframe的name属性一致)。
2.提交完成后,iframe中页面与主页面通信,通知上传结果及服务端文件信息
如何与主页面通信呢?
我们用nodejs在接收完了文件后返回了一个window.parent.主页面定义的方法,执行后可以得知文件上传完成。代码很简单:
router.post('/upload2', multipartMiddleware, function(req, res) {
var fpath = req.files.myfile.path;
var fname = fpath.substr(fpath.lastIndexOf('\\') + 1);
setTimeout(function {
var ret = ["
"window.parent.uploadFinished('" + fname + "');",
""];
res.send(ret.join(""搏慧));
}, 3000);
});
执行后可以打开开发人员选项,你会发现隐藏iframe中返回了服务器的一些数据。
第三种使用XMLHttpRequest2来进行真正的异步上传。
还是先贴出代码:
执行后可以打开开发人员选项,你会发现隐藏iframe中返回了服务器的一些数据。第三种使用XMLHttpRequest2来进行真正的异步上传。还是先贴出代码:
xhr level2 异步上传
附件:
正在上传...
停止上传
function upload {
// 1.准备FormData
var fd = new FormData;
fd.append("myfile", $("#myfile")[0].files[0]);
// 创建xhr对象
var xhr = new XMLHttpRequest;
// 监听状态,实时响应
// xhr 和 xhr.upload 都有progress事件,xhr.progress是下载进度,xhr.upload.progress是上传进度
xhr.upload.onprogress = function(event) {
if (event.lengthComputable) {
var percent = Math.round(event.loaded * 100 / event.total);
console.log('%d%', percent);
$("#upprog").text(percent);
}
};
// 传输开始事件
xhr.onloadstart = function(event) {
console.log('load start');
$("#upprog").text('开始上传');
$("#stopbtn").one('click', function { xhr.abort; $(this).hide();});
loading(true);
};
// ajax过程成功完成事件
xhr.onload = function(event) {
console.log('load success');
$("#upprog").text('上传成功');
console.log(xhr.responseText);
var ret = JSON.parse(xhr.responseText);
addToFlist(ret.fname);
};
// ajax过程发生错误事件
xhr.onerror = function(event) {
console.log('error');
$("#upprog").text('发生错误');
};
// ajax被取消
xhr.onabort = function(event) {
console.log('abort');
$("#upprog").text('操作被取消');
};
// loadend传输结束,不管成功失败都会被触发
xhr.onloadend = function (event) {
console.log('load end');
loading(false);
};
// 发起ajax请求传送数据
xhr.open('POST', '/upload3', true);
xhr.send(fd);
}
function addToFlist(fname) {
var temp = ["
",
fname,
"删除",
"
"
];
$("#flist").append(temp.join(""));
}
function delFile(fname) {
console.log('to delete file: ' + fname);
// TODO: 请实现
}
function loading(showloading) {
if (showloading) {
$("#uptxt").show();
$("#stopbtn").show();
} else {
$("#uptxt").hide();
$("#stopbtn").hide();
}
}
代码有点多,但是通俗易懂。使用过AJAX的人都知道,XHR对象提供了一个onreadystatechange的回调方法来监听整个请求/响应过程。在XMLHttpRequest2级规范中又多了几个进度事件。有以下6个事件:
1.loadstart:在接收到响应数据的第一个字节时触发。
2.progress:在接收响应期间持续不断地触发。
3.error:在请求发生错误时触发。
4.abort:在因为调用abort方法而终止连接时触发。
5.load:在接收到完整的响应数据时触发。
6.loadend: 在通信完成或者触发error,abort,load事件后触发。
这次我们可以解读代码:当传输事件开始后,我们便在停止传送按钮上添加点击事件,内置了abort方法可以停止传送。若不点则会正常上传直到传送完毕为止。其后台代码类似第二种方法。
三种方法各有优劣,做个简单的小结吧。
第三方控件交互性和可控性好,因为接近底层,其性能也是很优秀的。但是由于编写难度大通常需要自己安装插件,有时可能需要自己进行编写。
隐藏的iframe方法我个人觉得是非常有思想的一个方法,iframe可以帮我们做很多事。这种方式具有广泛的浏览器兼容性而且不需要安装插件。但是它交互性差,上传过程不可控,而且性能也是很一般的。
XHR2级的纯ajax上传,它必须要版本比较高一点的浏览器(ie9+)。但是它交互性特别好,可以看到上传进度并且是可控的。
D. layui 上传跨域java怎么修改
跨域要点jsoup协议,该协议的一个要点就是允许用歼历差户传递一个callback参数给服务端,然烂慎后服务端返回数据时会将这个callback参数作为函数名来包裹住 JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
所以需要前台传一个callback参数,该参数是客户端的一个方法,服务端收到callback参数以后,封装callback对应方法需要的参数,返回氏皮给客户端,即可实现跨域访问。
E. 后端配置跨域
原文连接: 原文地址
跨域的详细介樱稿绍可以参考: 浏览器和服务器实现跨域(CORS)判定的原理 ,这里不多赘述。
1、主要就是客户端向发送了服务端请求,服务器已经能返回数据,但是浏览器不接收
2、在接口里面加上:( 因为request是处理请求,response是返回森键结果 )
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Cache-Control","no-cache");
3、如果是使用Spring Boot创建的项目,直接添加 一句注解 到controller和方法脊春孝就可以了:
@CrossOrigin
其中@CrossOrigin中的2个参数:
origins : 允许可访问的域列表
maxAge :准备响应前的缓存持续的最大时间(以秒为单位)。
在这个例子中,对于retrieve()和remove()处理方法都启用了跨域支持,还可以看到如何使用@CrossOrigin属性定制CORS配置。如果同时使用controller和方法级别的CORS配置,Spring将合并两个注释属性以创建合并的CORS配置。
4、如果您正在使用Spring Security,请确保在Spring安全级别启用CORS,并允许它利用Spring MVC级别定义的配置。
二、全局CORS配置
除了细粒度、基于注释的配置之外,您还可能需要定义一些全局CORS配置。这类似于使用筛选器,但可以声明为Spring MVC并结合细粒度@CrossOrigin配置。默认情况下,所有origins and GET, HEAD and POST methods是允许的。
JavaConfig
使整个应用程序的CORS简化为:
更多使用请看原文连接和官方文档
F. 请教Java怎样实现跨服务器文件上传
你好!
另一台机器也要有处理文件上传的WEB程序郑庆,你可以喊蠢握参考Stream上传插件(支持HTML5和Flash两种方式上传)
Stream 上传插件
Stream 是解决不同浏览器上传文件的插件,是Uploadify的Flash版和Html5版的结合!
Stream 简介
Stream 是根据某网的文件上传插件加工而来,支持不同平台(Windows, Linux, Mac, Android, iOS)下,主流浏览器(IE7+, Chrome, Firefox, Safari, 其他)的上传工作,当然在Html5标准下,还支持文件档如的断点续传功能,有效解决大文件的Web上传问题!
主要特征
1. 源码完全开放,目前有Java、PHP、Perl三种后台语言实现
2. 支持HTML5、Flash两种方式(跨域)上传
3. 多文件一起上传
4. HTML5支持断点续传,拖拽等新特性
5. 兼容性好IE7+, FF3.6+, Chrome*,Safari4+,遨游等主流浏览器
6. 进度条、速度、剩余时间等附属信息
7. `选择文件的按钮`可以自定义
8. 简单的参数配置实现 灵活多变的功能
9. 支持文件夹上传(Chrome21+, Opera15+)
10. 支持自定义UI(V1.4+)
指定跨域上传就可以了
这些都是小鸟云的工程师告诉我的,建议你可以试试小鸟云
G. java为什么会有跨域问题
前言
相信大家在写前端脚本的时候经常会遇到发送数据到后台的情况,但是由于浏览器的限制,不同域名之间的数据是不能互相访问的,那前端怎么和后端如何进行数据之间的交换呢?
JavaScript由于安全性方面的考虑,不允许页面跨域调用其他页面的对象,那么问题来了,什么是跨域问题?
答:这是由于浏览器同源策略的限制,现在所有支持JavaScript的浏览器都使用了这个策略。那么什么是同源呢?所谓的同源是指三个方面“相同”:
域名相同
协议相同
端口相同
- 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();
- $.ajax({
- url: "your url",
- type:"get or post",
- dataType:"json",
- data:{
- ....
- },
- success:function(data){
- ...
- }
- $.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);
- }
- });
- 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();
- success_jsonpCallback({'status':'ok'})
下面就举几个例子来帮助更好的理解同源策略。
URL
说明
是否允许通信
http://www.a.com/a.js
http://www.a.com/b.js 同一域名 允许
http://www.a.com/a.js
http://www.b.com/a.js 不同域名 不允许
http://www.a.com:8000/a.js
http://www.a.com/b.js 同一域名不同端口 不允许
https://www.a.com/a.js
http://www.a.com/b.js 同一域名不同协议 不允许
在JAVA中处理跨域问题,通常有以下两种常用的解决方法。
第一种解决方法
后台代码在被请求的Servlet中添加Header设置:
Access-Control-Allow-Origin这个Header在W3C标准里用来检查该跨域请求是否可以被通过,如果值为*则表明当前页面可以跨域访问。默认的情况下是不允许的。
在前端JS中需要向Servlet发出请求,请求代码如下所示:
第二种解决方法
通过jsonp跨域请求的方式。JSONP和JSON虽然只有一个字母的区别,但是他们完全就是两回事,很多人很容易把他们搞混。JSON是一种数据交换的格式,而JSONP则是一种非官方跨域数据交互协议。
首先来说一下前端JS是怎么发送请求。代码如下所示:
这里的callbackparam和success_jsonpCallback可以理解为发送的data数据的键值对,可以自定义,但是callbackparam需要和后台约定好参数名称,因为后台需要获取到这个参数里面的值(即success_jsonpCallback)。
下面,最重要的来了,后台怎么样获取和返回数据呢。代码如下所示:
首先需要获取参数名为callbackparam的值,这里获取到的值就是“success_jsonpCallback”。然后将这个值加上一对小括号。小括号里放入你需要返回的数据内容,比如这里我返回一个JSON对象。当然你也可以返回其他对象,比如只返回一个字符串类型数据也可以。最后前端JS返回的数据就是这样的:
浏览器会自动解析为json对象,这时候你只需要在success回调函数中直接用data.status就可以了。