- 浏览: 66327 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (49)
- Server (3)
- JavaSE (6)
- Cache (2)
- Web (18)
- Struts1/Struts2 (7)
- Spring (3)
- eclipse/myeclipse (2)
- Linux (1)
- Freemarker/Jsp (3)
- Ibatis (0)
- Hibernate (1)
- Ajax (3)
- webservice (3)
- Exceptions (1)
- Android (7)
- Android permission (1)
- DataBase (0)
- DataBase Sqlite3 (1)
- DataBase Oracle (3)
- sina微博 分享 (1)
- 微博接口 (1)
最新评论
-
trx999:
为什么拿到了key了以后还是看不见地图啊?这是什么情况啊?貌似 ...
android google map key 申请变更[记录] -
wxlgzxx_1988:
achun 写道这个问题其实是http head中的Conte ...
ajax js跨域后乱码原因及解决办法 -
achun:
这个问题其实是http head中的Content-Type没 ...
ajax js跨域后乱码原因及解决办法 -
cmjcmj8080:
...
eclipse优化 -
wxlgzxx_1988:
上下文就是整个应用程序的运行环境,在这个环境里边可以保存一些对 ...
Struts2中OGNL极其用法
由于项目需要,对项目进行优化,将项目中的一部分动态页面生成静态页面来提高访问的速度,随后这些静态页面与web服务器分开,存于其他服务器,并为其指定了二级域名。问题来了,导致以前写的ajax全部over。
于是埋头苦找问题,照旧,在ajax的后提方法中设置断点,不料,断点尽然跳不进,后来,将ajax方法中与后台交互的url改为全路径(不用相对路径),结果,断点顺利进入,欣喜若狂。于是将所有url改为全路径,以为问题得到解决。后来发现ajax后台能够正常执行,但是页面上的ajax回调方法却没被执行。
由于之前没有类似经验,于是google百度一番,发现这是一个ajax跨域问题。网上给出的不外乎以下几种方法:
1.web端代理的方式,即用户访问A网站时所产生的对B网站的跨域访问请求均提交到A网站的指定页面,由该页面代替用户页面完成交互,从而返回合适的结果。
2.iframe,解决方案就是用window.location对象的hash属性,利用JS改变hash值网页不会刷新,可以这样实现通过JS访问hash值来做到通信,大体就是AB网站各嵌入一个对方网站的iframe,然后通过连续不断的监听hash值的变化来进行通信。比如A网站通过改变B网站iframe的hash后,B网站监听到hash的变化后就进行处理,这种方式需要开发者可以控制两个网站的代码。
3.通过script标签来请求,原理就是在本域内的A内生成一个JS标签,它的SRC指向请求的另外一个域的某个页面B,这个src里面通常会加一个A页面定义好的回调函数,B返回数据即可,可以直接返回调用这个回调函数,这种跨域的通信方式被称为JSONP,此方案存在的缺陷是, script的src属性完成该调用时采取的方式时get方式,如果请求时传递的字符串过大时,可能会无法正常运行。
4.window.name,window.name是一种解决跨域数据传输的新技术,通过在iframe中加载一个跨域的HTML文件,并且在HTML文件中设置window.name的值为需要传给接受者的数据,接收者就可以取得到window.name的值并且返回,比较关键的是同源策略的影响对location的控制不受限制,所以需要加载一个代理的页面来让发送页面读取window.name.
5.使用flash,原理是JavaScript将数据提交给本域下的 Flash,通过 Flash 中转去访问其他域的接口,只需要其他域的根目录下有一个crossdomain.xml文件,文件中设置允许所有域名或允许本域访问即可。
先说说自己项目的ajax架构:采用jquery1.6.2和struts2注解的形式
后台struts2示例代码:
@SuppressWarnings("serial")
@ParentPackage("json-default")
@Results( { @Result( type = "json })
public class BaserAjaxAction extends BaseAction {
Map<String, String> map = new HashMap<String, String>();
/**
* 是否登录
*
* @return
* @throws Exception
*/
public String isAreadyLogin() throws Exception {
try {
Object mid = this.getReq().getSession().getAttribute(
SessionKey.BASER_ID);
Object mname = this.getReq().getSession().getAttribute(
SessionKey.USER_NAME);
Object pic = this.getReq().getSession().getAttribute(
SessionKey.BASER_PIC);
if (null != mid && null != mname) {
map.put("result", "true");
map.put("userId", mid.toString());
map.put("userName", mname.toString());
if (pic != null && !"".equals(pic)) {
map.put("pic", Constant.UPLOAD_USER_IMAGE_DIR + pic);
}
} else {
map.put("result", "false");
}
} catch (Exception e) {
logger.error("isLogin", e);
}
return SUCCESS;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
}
代码很简单,这里采用注解的方式,这是利用struts2-json-plugin这个插件,采用json的数据传递格式与前台js交互。注意:这里map当然可以根据需要定义其他的存数数据的集合和数据类型。但是一定要有get方法,否则前台将不能正常得到数据信息(好好研究下struts2-json-plugin这个插件就知道了)。很方便
前台代码:
function isLogin() {
$.ajax( {
type : 'post',
url : basePath+'/front/baser_ajax!isAreadyLogin.action',
dataType : 'json',
success : isLoginCallback
});
}
function isLoginCallback(data) {
var htmlCode = "";
if (data.map.result == "true") {
htmlCode += "<a class='login_act' target='_blank' href=\'" + basePath
+ "/user/visterHome-" + data.map.userId + ".html'>"
+ data.map.userName + "</a>";
htmlCode += "<a class='login_act' href='javascript:loginOut();'>退出</a>";
htmlCode += "<a class='file_upload' href='javascript:checkLoginOn();'>上传视频</a>";
document.getElementById('isLogin').value = data.map.userId;
$('#afterLoginId_').html(htmlCode);
}
}
这里也很简单,就是通过url : basePath+'/front/baser_ajax!isAreadyLogin.action',跟后台的名为baser_ajax这个action中的isAreadyLogin方法交互,得到一些数据,再填充到页面,
但是对我来说,显然这以上所说的几种解决方案对我来说都不太实际,要改动很多代码,后来看到一篇关于jquery跨域的文章(忘记链接地址了),虽然说的不是很完全,但是对我帮助很大,里面说到采用第三方的一个协议jsonp. 于是就尝试,把 dataType : 'json',换成 dataType : 'jsonp', 后台struts2注解加上params = {
"callbackParameter", "callback" }),name = "success" 结果搞定。
完整代码:
@SuppressWarnings("serial")
@ParentPackage("json-default")
@Results( { @Result(name = "SUCCESS", type = "json", params = {
"callbackParameter", "callback" }) })
public class BaserAjaxAction extends BaseAction {
..................}
function isLogin() {
$.ajax( {
type : 'post',
url : basePath+'/front/baser_ajax!isAreadyLogin.action',
dataType : 'jsonp',
success : isLoginCallback
});
}
function isLoginCallback(data) {
var htmlCode = "";
if (data.map.result == "true") {
htmlCode += "<a class='login_act' target='_blank' href=\'" + basePath
+ "/user/visterHome-" + data.map.userId + ".html'>"
+ data.map.userName + "</a>";
htmlCode += "<a class='login_act' href='javascript:loginOut();'>退出</a>";
htmlCode += "<a class='file_upload' href='javascript:checkLoginOn();'>上传视频</a>";
document.getElementById('isLogin').value = data.map.userId;
$('#afterLoginId_').html(htmlCode);
}
}
希望对有需要的人有所帮助!
发表评论
-
新浪微博 一键关注
2012-07-25 10:29 1028新浪微博快捷关注: iframe方式: <if ... -
Jquery插件--easyUI属性汇总
2012-06-21 15:22 1303http://www.jeasyui.com/ ht ... -
jQuery常用函数记录(转载)
2012-06-05 14:53 685http://blog.csdn.net/cjm0927/ar ... -
Struts1.x Spring2.x Hibernate3.x DWR2.x整合笔记
2012-05-07 23:25 920Struts1.x Spring2.x H ... -
DWR异步验证问题记录
2012-04-29 00:58 902DWR提供的JS方法调用默认是异步的,所在在form提交的同时 ... -
ajax js跨域后乱码原因及解决办法
2012-02-27 11:11 5112项目中用到jQuery的ajax从二级域名下的页面访问web应 ... -
常用js代码大全4
2012-02-06 12:16 696JS代码判断集锦(之一) ... -
常用js代码大全3
2012-02-06 11:28 724三,高级应用(二) //组件是否安装 isCompon ... -
常用js代码大全2
2012-02-06 11:26 868常用js代码大全2 二, ... -
常用js代码大全1
2012-02-06 11:24 713常用js代码大全1 一,基础应用 事件源对象 event ... -
HTTP STATUS 状态码
2012-02-02 11:10 822HTTP状态码[笔记] HTTP状态码(HTTP S ... -
常用Javascript验证方法
2011-12-27 09:20 711/** * 检测复选框和单选框是否已被选中 * * ... -
Struts2 ActionContext与ServletActionContext
2011-12-22 10:16 973我们知道struts2接受客户端请求,在Action中 ... -
Struts2中OGNL极其用法
2011-12-20 21:32 1024Struts2中的表达式语言 ... -
JDBC连接数据库的各种配置
2011-12-20 12:45 9081 将数据库的JDBC驱动加载到classpath中,在基于J ... -
Struts2 token 原理
2011-12-16 16:03 1115token 拦截器用来解决表单重复提交的问题, 什么情况下 ... -
Freemarker 常用内置函数和用法
2011-10-17 11:00 802... -
IE与FireFox的js和css
2011-10-12 13:28 724禁止选取网页内容在IE ... -
Cookie中保存中文乱码 解决办法
2011-09-28 09:43 2976以前用cookie只是存一些 ... -
Cookie机制
2011-09-28 09:42 1263Cookie过期时间设置:int ...
相关推荐
基于ajax方式的跨域请求jsonp的前后台代码
ajax跨域请求,jsp页面+后台实例。
本资源主要介绍了AJAX跨域的解决办法,以及解决方案间的比较
一个ajax跨域请求的demo实例,前端采用jquery的ajax,后端采用tomcat集成的HttpServlet的方法接受前端的数据和返回数据
该资源为ASP.NET网站开发技术中使用Ajax进行跨域请求时利用JSONP方案解决浏览器同源策略限制的源码,比较简单,仅供参考
基于jQuery的jsonp ajax跨域请求,
ajax跨域请求WebService.asmx,程序非常完美的跑起来了。辛苦了一下午整理出来的。怕的就是以后自己忘记了。
NULL 博文链接:https://x125858805.iteye.com/blog/2215862
Jquery跨域访问Web服务的demo源码
利用JQuery jsonp实现Ajax跨域请求 .Net 的*.handler 和 WebService,返回json数据
ajax跨域请求解决方案。有详细配置方案,轻松解决ajax请求数据是的跨域问题。
使用juery提交表单,实现ajax跨域请求
主要介绍了基于CORS实现WebApi Ajax 跨域请求解决方法,需要的朋友可以参考下
通过jquery的ajax处理跨域请求的DEMO,代码比较简单,仅供学习参考。
AJAX(XMLHttpRequest)进行跨域请求方法详解
怎样实现Ajax 跨域访问的五种方法, 怎样实现Ajax 跨域访问的五种方法
html通过 ajax jsonp跨域请求接收和传送数据 使用HTML页面与后台跨域交互,获得后台数据或传输数据给后台
ajax跨域请求调用webservice接口+视频教程,上次的不带视频教程,这次带一个视频教程,一个流程下来,想学不会都很难!
ajax请求报parsererror错误是很宽泛的概念,很多情况下都报这个错, 在很多时候,即使ajax提交、返回都正常 XMLHttpRequest.status=200 (正常响应) XMLHttpRequest.readyState=4 (正常接收) ajax也会提示一个parse...