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);
}
}
第一次請求:
java控制台列印:
第二次請求:
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);
}
})
})
背景控制台列印(多次重新整理頁面,每次會生成新的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);
}
})
})
多次重新整理頁面控制台列印:
每次請求都會生成新的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);
}
})
})
控制台列印(多次重新整理頁面):
通過jsonp的方式可以解決跨域問題并實作sessionid共享。
先來無聊,試了試背景模拟http請求,每次請求都會生成新的sessionid。
以此來記錄對于跨域問題的了解,了解可能會有偏差,希望随着不斷深入學習了解,越來越逼近真相......