跨域

模拟一个跨域的过程,从端口为8080端口的服务器访问端口为80端口的服务器资源。

1.使用的是springMVC框架,新建一个简单的登录页面。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<html>

<head>
<base href="<%=basePath%>">
</head>

<body>
    用户名:
    <input type="text" name="name"></input>
    <br> 密码:
    <input type="password" name="pwd">
    <br>
    <button id="btn">提交</button>
</body>

</html>
<!-- 拷贝一份发布到80端口的tomcat,访问地址改为80,访问另外一个服务器的东西。 -->
<script type="text/javascript">
    $("#btn").on('click', function(e) {
        $.ajax({
            type : "POST", //提交方式  
            url : "<%=path%>/SpringMVC/getajax",   //路径  
            dataType:'json',
            data : {
                pwd:$('[name=pwd]').val(),
                name:$('[name=name]').val()
            },
            success : function(result) {//返回数据根据结果进行相应的处理
                result = eval('(' + result + ')'); //单个数据才需要使用
                if (result) {
                    console.log(result);
                } else {
                    console.log(result);
                }
            },
            error : function(error) {
                console.log(error);
            }
        });
    });
</script>

2.控制器为简单的打印

@Controller
public class Ajax {
    @ResponseBody
    @RequestMapping("/getajax")
    public void ajax(String name,String pwd){
        System.out.println(name+" "+pwd);
    }
    
    @RequestMapping("/ajax")
    public void toLogin(){
        
    }
}

现在可以正常的访问了。

页面里面输入名字密码提交,后台正常打印。

 

3.现在页面修改一下,添加到Hbuilder中,直接发布点开

image_thumb4

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<html>

<head>
<base href="<%=basePath%>">
</head>
本地页面

<body>
    用户名:
    <input type="text" name="name"></input>
    <br> 密码:
    <input type="password" name="pwd">
    <br>
    <button id="btn">提交</button>
</body>

</html>
<script type="text/javascript">
    $("#btn").on('click', function(e) {
        $.ajax({
            type : "POST", //提交方式  
            url : "http://127.0.0.1:8080/SpringMVC/getajax",   //路径  
            dataType:'text',
            data : {
                pwd:$('[name=pwd]').val(),
                name:$('[name=name]').val()
            },
            success : function(result) {//返回数据根据结果进行相应的处理
            console.log(result);
            },
            error : function(error) {
                console.log(error);
            }
        });
    });
</script>

同样操作。由于是本地访问服务器,也就是域不同

导致访问时候报错

image_thumb1

 

 

 

解决方法CORS:1.在服务端增加

@Controller
public class Ajax {
    @ResponseBody
    @RequestMapping("/getajax")
    public void ajax(String name,String pwd,HttpServletResponse response){
        System.out.println(name+" "+pwd);
        response.addHeader("Access-Control-Allow-Origin", "*");
    }
    
    @RequestMapping("/ajax")
    public void toLogin(){ //自动映射到ajax页面。
        
    }
}

然后访问就ok了。

 

4.但是问题:因为跨域,默认是不支持cookie,所以导致sessionid不能传给服务器。所以每次请求都是新的session

服务端返回sessionID打印。

@Controller
public class Ajax {
    @ResponseBody
    @RequestMapping("/getajax")
    public String ajax(String name,String pwd,HttpServletResponse response,HttpServletRequest request){
        System.out.println(name+" "+pwd);
        

      response.addHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8020");
      response.addHeader("Access-Control-Allow-Credentials", "true");


        String str=request.getSession().getId();
        return str;
    }
    
    @RequestMapping("/ajax")
    public void toLogin(){ //自动映射到ajax页面。
        
    }
}

jsp修改一下

<script type="text/javascript">
    $("#btn").on('click', function(e) {
        $.ajax({
            type: "POST", //提交方式  
            url: "http://127.0.0.1:8080/SpringMVC/getajax", //路径  
            dataType: 'text',
            data: {
                pwd: $('[name=pwd]').val(),
                name: $('[name=name]').val()
            },
            success: function(result) { //返回数据根据结果进行相应的处理
                console.log(result);
            },
            error: function(error) {
                console.log(error);
            },
            xhrFields: {
                withCredentials: true
            },
            crossDomain: true
        });
    });
</script>

提交多几次看一下结果:

image_thumb5

每个的sessionID都相同了

 

6。用jsonp

JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。

服务器端:

@RequestMapping("/getajaxbyjsonp")
public void jsonp(HttpServletResponse response,HttpServletRequest request) throws Exception{
    User user=new User();
    user.setName("linq");
    user.setNum(07);
    ObjectMapper mapper=new ObjectMapper();
    String jsonString = mapper.writeValueAsString(user);
   
    String callBackFuncString = request.getParameter("callback");   
    PrintWriter out = response.getWriter();
    out.print(callBackFuncString+"("+jsonString+")");
    out.flush();

}

 

ajax:

<script type="text/javascript">
    $("#btn").on('click', function(e) {
        $.ajax({
            type: "POST", //提交方式  
            url: "http://127.0.0.1:8080/SpringMVC/getajaxbyjsonp", //路径  
            dataType: 'jsonp',
            data: {
                pwd: $('[name=pwd]').val(),
                name: $('[name=name]').val()
            },
            success: function(result) { //返回数据根据结果进行相应的处理
                console.log(result);
            },
            error: function(error) {
                console.log(error);
            }/*,
            xhrFields: {
                withCredentials: true
            },
            crossDomain: true*/
        });
    });
</script>
posted @ 2017-09-26 10:53  永恒之蓝  阅读(130)  评论(0编辑  收藏  举报