天天看點

淺談對JS跨域問題的了解及sessionid共享問題1.什麼是跨域2. 什麼是session3.跨域問題會造成sessionid不能共享,那麼是不是解決了跨域問題,就可以實作sessionid共享了呢?

1.什麼是跨域

協定 域名 端口号有一個不一樣就是跨域。跨域是由于浏覽器的同源政策造成的,指浏覽器不能執行其他網站的腳本。

2. 什麼是session

在WEB開發中,伺服器可以為每個使用者浏覽器建立一個會話對象(session對象),注意:一個浏覽器獨占一個session對象(預設情況下)。session代表伺服器與浏覽器完成一次會話。

http請求是無狀态的,那麼是如何知道多次浏覽器的請求是同一個會話呢?

伺服器建立session出來後,會把session的id号,以cookie的形式回寫給客戶機,這樣,隻要客戶機的浏覽器不關,再去通路伺服器時,都會帶着session的id号去,伺服器發現客戶機浏覽器帶session id過來了,就會使用記憶體中與之對應的session為之服務。

見如下代碼:

package test;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class JsonPTest
 */
@SuppressWarnings("serial")
@WebServlet("/JsonPTest")
public class JsonPTest extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		HttpSession session = request.getSession();
		session.setAttribute("data", "yjx");
		String sessionId = session.getId();
		if(session.isNew()){
			System.out.println("session為新建立,sessionId為:" + sessionId);
		}else{
			System.out.println("sessionId已建立");
		}
		response.setContentType("application/json;charset=utf-8");
		String jsonStr ="{\"id\":\"123\",\"name\":\"yjx\"}";
		PrintWriter out = null;
		out = response.getWriter();
		out.write(jsonStr);
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
           

第一次請求:

淺談對JS跨域問題的了解及sessionid共享問題1.什麼是跨域2. 什麼是session3.跨域問題會造成sessionid不能共享,那麼是不是解決了跨域問題,就可以實作sessionid共享了呢?

java控制台列印:

淺談對JS跨域問題的了解及sessionid共享問題1.什麼是跨域2. 什麼是session3.跨域問題會造成sessionid不能共享,那麼是不是解決了跨域問題,就可以實作sessionid共享了呢?

第二次請求:

淺談對JS跨域問題的了解及sessionid共享問題1.什麼是跨域2. 什麼是session3.跨域問題會造成sessionid不能共享,那麼是不是解決了跨域問題,就可以實作sessionid共享了呢?
淺談對JS跨域問題的了解及sessionid共享問題1.什麼是跨域2. 什麼是session3.跨域問題會造成sessionid不能共享,那麼是不是解決了跨域問題,就可以實作sessionid共享了呢?

3.跨域問題會造成sessionid不能共享,那麼是不是解決了跨域問題,就可以實作sessionid共享了呢?

(以前隻是知道ip端口不同會造成跨域,ajax請求背景,不能正确傳回結果,還有一個誤區是因為tomcat容器不一樣,會出現跨域,java背景代碼實作是不存在跨域問題的,跨域問題是因為浏覽器的同源政策造成的。同源政策!!!!!!不要被誤解)

1.跨域請求(同一台電腦上啟動兩個tomcat,伺服器端:webtest項目端口為8080,前端jsonptest項目端口8081):

$(function(){
	
	$.ajax({
		url:'http://127.0.0.1:8080/webtest/jsonpTest',
		type:'post',
		dataType: "json", //指定伺服器傳回的資料類型
		//jsonp: "jsonpCallback",//服務端用于接收callback調用的function名的參數  
		success:function(data){
			alert(data.id +':' + data.name);
		}
	})
	
})
           
淺談對JS跨域問題的了解及sessionid共享問題1.什麼是跨域2. 什麼是session3.跨域問題會造成sessionid不能共享,那麼是不是解決了跨域問題,就可以實作sessionid共享了呢?

背景控制台列印(多次重新整理頁面,每次會生成新的sessionid):

淺談對JS跨域問題的了解及sessionid共享問題1.什麼是跨域2. 什麼是session3.跨域問題會造成sessionid不能共享,那麼是不是解決了跨域問題,就可以實作sessionid共享了呢?

2.解決跨域問題的兩種方式(其它實作方法未寫出)

(1)背景配置(不可實作sessionid共享)

設定response.setHeader("Access-Control-Allow-Origin", "*");

response.setHeader("Access-Control-Allow-Origin", "*");
           

前端代碼:

$(function(){
	
	$.ajax({
		url:'http://127.0.0.1:8080/webtest/jsonpTest',
		type:'post',
		dataType: "json", //指定伺服器傳回的資料類型
		//jsonp: "jsonpCallback",//服務端用于接收callback調用的function名的參數  
		success:function(data){
			alert(data.id +':' + data.name);
		}
	})
	
})
           

多次重新整理頁面控制台列印:

淺談對JS跨域問題的了解及sessionid共享問題1.什麼是跨域2. 什麼是session3.跨域問題會造成sessionid不能共享,那麼是不是解決了跨域問題,就可以實作sessionid共享了呢?

每次請求都會生成新的sessionid。并沒有實作sessionid共享。

(2)jsonp(可實作sessionid共享)。

背景代碼:

package test;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class JsonPTest
 */
@SuppressWarnings("serial")
@WebServlet("/JsonPTest")
public class JsonPTest extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		HttpSession session = request.getSession();
		session.setAttribute("data", "yjx");
		String sessionId = session.getId();
		if(session.isNew()){
			System.out.println("session為新建立,sessionId為:" + sessionId);
		}else{
			System.out.println("sessionId已建立");
		}
		
//		response.setHeader("Access-Control-Allow-Origin", "*");
		response.setContentType("application/json;charset=utf-8");
		String jsonStr ="{\"id\":\"123\",\"name\":\"yjx\"}";
//		PrintWriter out = null;
//		out = response.getWriter();
//		out.write(jsonStr);
		
		Map<String, String> map = new HashMap<String,String>();
		map.put("result", "content");
		PrintWriter out = response.getWriter();
		String jsonpCallback = request.getParameter("jsonpCallback");
		out.println(jsonpCallback + "("+jsonStr+")");
		out.flush();
		out.close();
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
           

前端代碼:

$(function(){
	
	$.ajax({
		url:'http://127.0.0.1:8080/webtest/jsonpTest',
		type:'post',
		dataType: "jsonp", //指定伺服器傳回的資料類型
		jsonp: "jsonpCallback",//服務端用于接收callback調用的function名的參數  
		success:function(data){
			alert(data.id +':' + data.name);
		}
	})
	
})
           

控制台列印(多次重新整理頁面):

淺談對JS跨域問題的了解及sessionid共享問題1.什麼是跨域2. 什麼是session3.跨域問題會造成sessionid不能共享,那麼是不是解決了跨域問題,就可以實作sessionid共享了呢?
淺談對JS跨域問題的了解及sessionid共享問題1.什麼是跨域2. 什麼是session3.跨域問題會造成sessionid不能共享,那麼是不是解決了跨域問題,就可以實作sessionid共享了呢?

通過jsonp的方式可以解決跨域問題并實作sessionid共享。

先來無聊,試了試背景模拟http請求,每次請求都會生成新的sessionid。

以此來記錄對于跨域問題的了解,了解可能會有偏差,希望随着不斷深入學習了解,越來越逼近真相......