01 04JSP&Servlet實戰開發之SESSION內置對象

1 基本概念

session對象其對應的類型是javax.servlet.http.HttpSession接口的實例。此接口定義如下:

public interface HttpSession

之前的HttpServletRequest繼承了ServletRequest父接口,HttpServletResponse繼承了ServletResponse父接口,但是HttpSession沒有繼承自任何的父接口,因爲session是屬於HTTP協議範圍的內容。

在HttpSession接口裏面最重要的方法就是屬性操作,除了這組方法之外,一下的兩個方法是最爲重要的:
(1)取得SessionID:public String getId()
(2)讓當前Session失效:public void invalidate()
範例:直接取得ID

<%@ page pageEncoding="UTF-8" %>
<%
    String id = session.getId();
%>
<h1><%=id%></h1>

經過分析之後可以發現,隨着請求頭信息發送來的JSESSIONID以及在Cookie裏面自動保存的JSESSIONID都是當前的sessionID。

Session的操作原理:
(1)Session的整個操作過程之中一定使用到了Cookie機制;
(2)當客戶端進行第一次訪問的時候,那麼服務器端就會自動的爲其分配一個SESSIONID,並且將這個session Id自動的保存在客戶端瀏覽器上,也就是說可以利用是否在請求頭信息中出現過JSESSIONID來判斷是否是新用戶。
(3)每當用戶發出請求之後,那麼會自動將JSESSIONID發送到服務器端上,服務器端會通過發送來的Cookie自動地取得JSESSIONID的內容,並且將此內容與服務器端上保存的SESSIONID進行匹配,以確定不同的用戶。

面試題:請解釋Session與Cookie的關係?
(1)Session的數據保存在了服務器端上,而Cookie的數據保存在客戶端瀏覽器中;
(2)Session使用到了Cookie的處理機制。

在session對象裏面提供的invalidate()方法表示讓當前的session失效,意味着服務器端會將此客戶端的信息刪除掉,如果此客戶端重新訪問,那麼於服務器端而言就表示要分配一個新的SessionID給這個客戶端。

<%
	session.invalidate();
%>

所有B/S結構的項目裏面出現過的用戶註銷功能都是依靠以上的代碼實現的。

在session對象裏面提供有一個方法:public boolean isNew(),判斷當前的session是否是新的session。

<%@ page pageEncoding="UTF-8" %>
<%
    if(session.isNew()){
%>
        <h1>歡迎第一次登錄本網站!</h1>
<%
    }else{
%>
        <h1>歡迎回來!</h1>
<%
    }
%>

通過此方法可以在用戶第一次訪問的時候進行一些準備操作。

2 基礎登錄

在實際的開發之中,session最大的功能在於登陸驗證操作上,在session屬性操作的時候有一個特點:不管是服務器端跳轉還是客戶端跳轉,session設置的屬性都能夠被保存下來。

一般登陸驗證的基本流程:
(1)用戶根據表單輸入用戶名與密碼,而後進行數據的驗證;
(2)如果驗證通過,則在session裏面保存用戶名,以後的頁面裏面通過getAttribute()方法取得指定屬性,如果指定屬性存在(不爲null),那麼表示用戶已經正常登錄過了,反之用戶就沒有登錄,應該跳轉到登錄頁面上登錄。
(3)一定要提供有用戶的註銷功能,使用invalidate()方法完成。
範例:welcome.jsp

<%@ page pageEncoding="UTF-8" %>
<%
    if(session.getAttribute("username") != null){
%>
        <h1>Welcome, user <%=session.getAttribute("username")%>!</h1>
<%
    }else{
        response.setHeader("refresh", "3;URL=login.jsp");
%>
        <h1>Please login first, auto forward after 3s. if not, click <a href="login.jsp">here</a> to login.</h1>
<%
    }
%>

現在的功能就是進行屬性的取得,而後判斷是否有內容,因爲只要是設置了內容一定是表示合法用戶。
範例:定義login.jsp頁面
此頁面要提供有信息輸入表單,還要提供有登錄驗證(假設固定信息:lks/19990821)

<%@ page pageEncoding="UTF-8" %>
<form action="login.jsp" method="post">
    Username: <input type="text" name="username"/><br>
    Password: <input type="text" name="password"/><br>
    <input type="submit" value="Sign in"/>
</form>
<%
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    if(!(username == null && password == null)){
        if("lks".equals(username) && "19990821".equals(password)){
            session.setAttribute("username", username);
            response.sendRedirect("welcome.jsp");
        }else{
%>
            <h2>Username or password is wrong!</h1>
<%
        }
    }
%>

由於session屬性本身的保存特點,在瀏覽器未關閉前session都可以保存,而且每一個session只保存一個獨立用戶的信息,不同的session間是不能夠進行訪問的。

3 改善登錄

以上的代碼只能夠說是完成了一個最基礎的登陸操作功能,但是這個登陸是不安全的,功能也不完善:
(1)不完善:缺少用戶註銷的功能;
(2)不安全:這個時候的用戶名和密碼是可以破解的,所以應該使用驗證碼功能。
1、實現用戶註銷功能
(1)用戶註銷一定是已經合法登錄過的用戶進行的操作,所以可以在welcome.jsp頁面裏面增加一個具體的鏈接,指向loginout.jsp頁面;
(2)在login.jsp頁面可以使用invalidate()方法實現註銷操作。
範例:修改welcome.jsp頁面

<%@ page pageEncoding="UTF-8" %>
<%
    if(session.getAttribute("username") != null){
%>
        <h1>Welcome, user <%=session.getAttribute("username")%>!</h1>
        <h1><a href="loginout.jsp">Sign out</a></h1>
<%
    }else{
        response.setHeader("refresh", "3;URL=login.jsp");
%>
        <h1>Please login first, auto forward after 3s. if not, click <a href="login.jsp">here</a> to login.</h1>
<%
    }
%>

範例:定義loginout.jsp頁面

<%@ page pageEncoding="UTF-8" %>
<%
    session.invalidate();
%>
    <h1>Sign out success! auto forward to login UI after 2s. If not, click <a href="login.jsp">here</a></h1>
<%
    response.setHeader("refresh","2;URL=login.jsp");
%>

2、需要使用驗證碼
一般驗證碼都是通過JSP動態生成的,所以來講基本上驗證碼的JSP頁面其MIME類型都是圖片類型;

<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" pageEncoding="UTF-8" %>

而後所生成的驗證碼都會保存在session屬性裏面:

//將認證碼存入SESSION
session.setAttribute("rand", sRand);

也就是說用戶輸入的驗證碼如果與session屬性中的驗證碼相同,則表示正常登錄的用戶。

驗證碼的導入操作與圖片一樣。

Code: <input type="text" name="code" size="4" maxlength="4"/><img src="image.jsp"><br>

隨後在進行表單提交的時候,首先要驗證的就是驗證碼是否正確,但是一般可以忽略大小寫。

String code = request.getParameter("code");
    if(((String)session.getAttribute("rand")).equalsIgnoreCase(code))

很多時候有可能會換其他方式顯示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章