• ajax实现跨域访问的两种方式


    一、使用jsonp实现跨域请求

    在前端开发这中你会发现,所有带src属性的标签都可以跨域访问其他服务器文件。jsonp实现的原理也是如此。

    以jsonp的数据类型进行请求时,JQ会动态在页面中添加script标签,将请求内容放置到src中。

    jsonp类型请求数据时,无法使用post方式(你会发现,在JQ中即使你将type设置为POST方式,JQ也会将其转换为get方式请求)。

    jsonp方式请求不支持修改头部信息参数。服务器端数据返回也需要做相应的处理,返回的数据必须是一个JS代码。Jsonp请求时,设置jsonpCallback参数假设为reciver,服务器处理数据返回格式类似于reviver('datas need retun '),请求成功后,会自动调用前端reciver方法。

    JQ前端请求代码:

    1. $.ajax({  
    2.         type: "get",  
    3.         async: false,  
    4.         url: "http://192.168.2.229:8081/api/web_search_directnew.html",  
    5.         dataType: "jsonp",  
    6.         jsonpCallback: "receive", //自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据    
    7.         success: function(data) {  
    8.             console.log(data)  
    9.         },  
    10.         error: function() {  
    11.             alert('fail');  
    12.         }  
    13.     });  
    14. function receive(data){  
    15.       
    16. }  

    java后台代码:

    1. def index() {  
    2.         def a = [:]  
    3.         a.name = "张小白"  
    4.         a.age = 12  
    5.         a.sex = '男'  
    6.         a = a as JSON  
    7.         render params.callback + "('" + a + "')"  
    8.     }  

    二、Access-Control-Allow-Origin

    服务器端在返回资源的时候,指定这个资源能被哪些域所访问。如response.addHeader( "Access-Control-Allow-Origin", "http://192.168.2.229:8020" );指定http://192.168.2.229:8020可以进行跨域访问该资源,若不限制,则改成*

    浏览器限制:Chrome 3+,Firefox 3.5+,Opera 12+,Safari 4+,IE 8+

    js代码:

    1. $.ajax({  
    2.     url: "http://192.168.2.229:8091/myTest/hellow/index",  
    3.     type: "POST",  
    4.     crossDomain: true,  
    5.     dataType: "json",  
    6.     success: function(result) {  
    7.         alert(JSON.stringify(result));  
    8.     },  
    9.     error: function(xhr, status, error) {  
    10.     alert(status);  
    11.     }  
    12. });  

    服务器:

     response.addHeader( "Access-Control-Allow-Origin", "http://192.168.2.229:8020" )  

    我自己尝试之后的代码,可供参考:

    js代码

    	function sub(){
    		var uname = $("#uname").val();
    		var upass = $("#upass").val();
    		var url = "/system/do_login1.htm";
    		$.ajax({
    			type: "POST",//请求方式
    			url: url,
    			dataType:"jsonp",
    			jsonp:"jsonpCallback",
    			data: {
    				"uname": uname,
    				"upass": upass
    			},
    			success : function(msg) {
    				alert(msg)
    				
    		},
    	});
    	}
    

     后台代码

    @RequestMapping("/system/do_login1.htm")
    	public void isUser(HttpServletRequest request,HttpServletResponse response,
    			ModelMap map,String uname,String upass) throws Exception{
    		TSysUser sysUser = sysUserManager.getSysUserByLogin(uname, upass);
    		Gson gson = new Gson();
    		String jsonpCallback = request.getParameter("jsonpCallback");
    		if(sysUser != null){
    			String massage = "验证成功";
    			
    			response.getWriter().print(jsonpCallback+"("+gson.toJson(massage)+")");
    		}else{
    			String massage = "用户名或密码错误";
    			
    			response.getWriter().print(jsonpCallback+"("+gson.toJson(massage)+")");
    		}
    	}
    

      

  • 相关阅读:
    配置svn
    驱动开发问题error 2019: __ftol2_sse 找不到的错误哦
    ollydbg,ring3级别的调试软件
    IoAttachDevice源码
    新手搭建 eclipse+winDDK驱动开发平台
    IoCallDriver源码剖析
    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
    error LNK2019: 无法解析的外部符号 "int __cdecl wsprintf
    (转)3ds Max 和 Away3D工作流程
    页游客户端热更新时获取的是旧资源的处理办法
  • 原文地址:https://www.cnblogs.com/qcq0703/p/8559861.html
Copyright © 2020-2023  润新知