客戶端開啟與伺服器的連接,發出請求直到伺服器回應客戶端請求的整個過程稱之為會話 。
推薦課程:Java教學。
瀏覽器與伺服器之間的通訊是透過HTTP協定進行通訊的,而HTTP協定是」無狀態」的協議,它不能保存客戶的訊息,即一次回應完成之後連接就斷開了,下一次的請求需要重新連接,當用戶在同一網站的多個頁面之間轉換時,根本無法確定是否是同一個客戶,會話追蹤技術就可以實現這種要求。
Cookie
伺服器在回應請求時可以將一些資料以"鍵-值"對的形式透過回應訊息保存在用戶端。當瀏覽器再次存取相同的應用程式時,會將原先的存有session ID的Cookie透過請求資訊帶到伺服器端,網頁伺服器透過識別唯一的session ID來代表每個客戶端,從而識別這個客戶端接下來的請求。
Cookie不是內建對象,需要自行建立Cookie的實例。是伺服器往客戶端寫的一段文字訊息,該訊息是可以修改的,所以一般情況cookie會儲存一些非敏感訊息,當客戶端再次要求伺服器的時候,會將Cookie以請求頭的方式傳送到伺服器,這時候伺服器就能區分是誰在訪問了。
用於會話追蹤的Cookie叫做會話Cookie。 Servlet規格中會話追蹤的cookie名字必須是JSESSIONID,保存在瀏覽器的記憶體中。
Cookie可以用來維持使用者的會話狀態,但Cookie資訊保存在客戶端,有較大的安全隱患,且一般瀏覽器對Cookie的數目及資料大小有嚴格的限制。在Web應用程式中,一般情況下透過HttpSession物件保持會話狀態
Cookie cookie = new Cookie("键", "值"); //创建cookie cookie.setMaxAge(60*60*24); //设置cookie的有效期 cookie.setPath("/"); //设置cookie的有效范围(路径) response.addCookie(cookie); //将cookie写入到客户端
Session
Session 是存放在伺服器端的,更安全。每個使用者都有一個不同的session,各個使用者之間是不能共享的。
Session是依賴Cookie的,如果Cookie被停用,那麼session也會失效 。
Session技術則是服務端的解決方案,它是透過伺服器來保持狀態的。在Java中是透過呼叫HttpServletRequest的getSession方法(使用true作為參數)來建立的。在創建了Session的同時,伺服器會為該Session產生唯一的Session id,而這個Session id在隨後的請求中會被用來重新獲得已經創建的Session;在Session被創建之後,就可以調用Session相關的方法在Session中增加內容了,而這些內容只會保存在伺服器中,發到客戶端的只有Session id;當客戶端再次發送請求的時候,會將這個Session id帶上,伺服器接受到請求之後就會依據Session id找到對應的Session,從而再次使用。正式這樣一個過程,用戶的狀態也就得以維持了。
session.setAttribute(String name,Object obj); //往session中存放内容(通过键和值的形式) session.getAtrribute(String name); //通过键从session中获取内容 session.removeAttribute(String name); //把存储在session中的对象移除 session.invalidate(); //销毁session
隱藏表單域
隱藏表單域是將會話ID加入到HTML的隱藏表單中(類型為hidden的input)。重定向和轉發
透過進行訊息的傳遞 。透過表單形式提交到伺服器,但是本身不顯示。
例如第二個表單中取得第一個表單中的內容,並以隱藏域( 文字方塊type為hidden) 的方式接受第一個表單中的內容,再次傳遞到第三個表單中。通俗點說請求的順序是這樣的:表單- - > 表單二- - >表單三,但是表單三需要用到表單一提交的內容,所以就會需要表單二作為過渡,把錶單一的內容以隱藏域的形式儲存,然後再傳遞到表單三。
重寫URL
把會話ID編碼在網址中。例:counter.jjsp;jsessionnid=be8d697876787876befdbde898789098980這樣,即使瀏覽器不支援cookie,也能夠實現會話追蹤。
對於URL複寫,伺服器從請求的URI中提取出會話ID,並把該請求與對應的會話關聯起來,然後在存取會話資料的時候,JSP頁面所進行的處理方式就和使用cookie追蹤會話id時所使用的方式完全相同。所以sesssion的實現要依賴cookie或URL複寫技術。
String sessionId = request.getRequestedSessionId(); //获得sessionId
透過response物件的encodeURL(StringURL)實作URL地值重寫:
<a href="<%=response.encodeURL("index.jsp") %>"> index页面</a>
此方法會自動判斷客戶端是否支援Cookie。如果客戶端支援Cookie,會將URL原封不動地輸出來。如果客戶端不支援Cookie,則會呼叫encodeURL()方法之後會自動將使用者Session的id重寫到URL中。重寫後的輸出可能是這樣的:
a href="index.jsp?jsessionid=0E0C61100AEB06DE6A95EB1CD1DA8158">index页面</a>
HttpServletResponse介面定義了兩個用於URL重寫的方法:
encodeURL方法,用於超鏈接和form表單的action屬性中設定的URL進行重寫
encodeRedirectURL 方法用於對傳遞給HttpServletResponse.sendRedirect()方法的URL進行重寫
#他們根據請求訊息中是否含有Cookie頭欄位來決定是否進行url重寫。把URL當作參數傳遞給這兩個方法,他們就能完成url重寫,在url後面加上 jsessionid參數及其值。可以關閉瀏覽器的Cookie,然後,進行實驗,在網頁原始檔中查看URL後面是否有jsessionid參數及其值。
以上是jsp/servlet會話是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!