教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

JAVA培訓(xùn)之HttpSession第二例

更新時(shí)間:2016年08月26日11時(shí)41分 來源:傳智播客JAVA培訓(xùn)學(xué)院 瀏覽次數(shù):

通過HttpSession案例分析,我們已經(jīng)對(duì)保存用戶信息案例的功能需求有了一定的了解,下面我們就來完成該案例,案例詳情請(qǐng)參考HttpSession第二例步驟詳解,點(diǎn)擊此處 下載案例源代碼,具體操作步驟如下所示:
(1)新建一個(gè)web應(yīng)用,Example22,在WebRoot目錄下新建一個(gè)目錄session,并在該目錄下新建一個(gè)jsp文件,名稱為login.jsp,主要代碼如例1-1所示:
例1-1 login .jsp
<body>
<form action="/Example22/LoginServlet" method="post">
    用戶名:<input type="text" name="username"/><br/>
    密 碼:<input type="password" name="password"/><br/>
    <input type="submit" value="登錄"/>
</form>
</body>
例1-1中,form表單的提交方式是post,提交的路徑:“/Example22/LoginServlet“,其中”/LoginServlet“是Servlet類的訪問路徑,后面會(huì)說明。
(2)在session目錄下再新建一個(gè)jsp文件,succ1.jsp。
(3)在session目錄再新建一個(gè)jsp文件,succ2.jsp。
(4)在src目錄下新建一個(gè)Servlet類,名稱為L(zhǎng)oginServlet,其訪問路徑配置為“/LoginServlet”,主要代碼如例1-3所示:
例1-3 LoginServlet.java
public class LoginServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
       /*
        * 1. 獲取表單數(shù)據(jù)
        */
       // 處理中文問題
       request.setCharacterEncoding("utf-8");
       // 獲取
       String username = request.getParameter("username");
       String password = request.getParameter("password");
       /*
        * 2. 校驗(yàn)用戶名和密碼是否正確
        */
       if(!"itcast".equalsIgnoreCase(username)) {//登錄成功
           /*
            * 3. 如果成功
            *   >  保存用戶信息到session中
            *   >  重定向到succ1.jsp
            */
           HttpSession session = request.getSession();//獲取session
           session.setAttribute("username", username);//向session域中保存用戶名
           response.sendRedirect("/Example22/session/succ1.jsp");
       } else {//登錄失敗
           /*
            * 4. 如果失敗
            *   > 保存錯(cuò)誤信息到request域中
            *   > 轉(zhuǎn)發(fā)到login.jsp
            */
           request.setAttribute("msg", "用戶名或密碼錯(cuò)誤!");
            RequestDispatcher qr=
            request.getRequestDispatcher("/session/login.jsp");//得到轉(zhuǎn)發(fā)器
           qr.forward(request, response);//轉(zhuǎn)發(fā)
       }
    }
}
例1-3中,首先獲得請(qǐng)求參數(shù),因?yàn)楸韱翁峤坏姆绞绞莗ost,所以對(duì)于請(qǐng)求參數(shù)的亂碼問題可以使用request的setCharacterEncoding("utf-8")方法處理亂碼。獲取的用戶名如果是“itcast”就讓它登錄失敗,將錯(cuò)誤信息“用戶名或密碼錯(cuò)誤”保存在request域,然后再轉(zhuǎn)發(fā)到login.jsp頁(yè)面。如果不是“itcast”就表示登錄成功,將用戶名保存在session域中,然后重定向到succ1.jsp頁(yè)面。
(5)對(duì)login.jsp頁(yè)面做一些補(bǔ)充,具體如例1-4所示:
例1-4 login.jsp
<body>
<%
    String message = "";
    String msg = (String)request.getAttribute("msg");//獲取request域中的名為msg的屬性
    if(msg != null) {
       message = msg;
    }
%>
<font color="red"><b><%=message %> </b></font>
... ...此處省略例1-1中的代碼
</body>
例1-4中,在login.jsp頁(yè)面中,從request域中取出錯(cuò)誤信息,這個(gè)時(shí)候我們要考慮到一個(gè)問題,如果直接將錯(cuò)誤信息輸出到瀏覽器端,會(huì)有一個(gè)問題,當(dāng)用戶直接訪問login.jsp頁(yè)面時(shí),request域中還沒有存放msg屬性,因此msg的值為空,所以瀏覽器端會(huì)輸出null。因此我們要先判斷msg是否為空,如果不為空再將它輸出到瀏覽器端。
(6)succ1.jsp頁(yè)面信息如例1-5所示:
例1-5 succ1.jsp
<body>
<h1>succ1</h1>
<%
String username = (String)session.getAttribute("username");
if(username == null) {
    /*
    1. 向request域中保存錯(cuò)誤信息,轉(zhuǎn)發(fā)到login.jsp
    */
    request.setAttribute("msg", "您還沒有登錄!請(qǐng)求先登錄!");
    request.getRequestDispatcher("/session/login.jsp").forward(request,
 response);
    return;
}
%>
歡迎歡迎,熱烈歡迎,歡迎<%=username %>領(lǐng)導(dǎo)指導(dǎo)工作!
  </body>
例1-5中,首先從session中獲取登錄的用戶名,如果用戶名username為空,則表明當(dāng)前用戶沒有登錄,就直接訪問本頁(yè)面,所以向request域中添加錯(cuò)誤信息“您還沒有登錄!請(qǐng)先登錄!”,然后轉(zhuǎn)發(fā)到login.jsp頁(yè)面,如果用戶名username不為空就將用戶名顯示在頁(yè)面中,如<%username%>。
(7)succ2.jsp和succ1.jsp內(nèi)容相同,這里就不在敘述了。
(8)將Example22發(fā)布到Tomcat服務(wù)器,然后啟動(dòng)服務(wù)器,在瀏覽器端訪問login.jsp,瀏覽器顯示結(jié)果如圖1-1所示:

圖1-1 登錄頁(yè)面
(9)在圖1-1中,輸入用戶名:itcast,密碼123,然后點(diǎn)擊“登錄”按鈕,瀏覽器顯示結(jié)果如圖1-2所示:

圖1-2 登錄失敗
圖1-2中,顯示“用戶名和登錄錯(cuò)誤“,說明登錄失敗,轉(zhuǎn)發(fā)到了login.jsp頁(yè)面。在LoginServlet中,我們?cè)O(shè)定的邏輯就是如果用戶名為itcast,就表示登錄失敗。
(10)在圖1-2中,輸入用戶名:aaa,密碼:123,點(diǎn)擊“登錄“,瀏覽器顯示結(jié)果如圖1-3所示:

圖1-3 登錄成功
由圖1-3可知,登錄成功后重定向到succ1.jsp,地址欄上的地址改變,并且顯示當(dāng)前用戶的名稱:aaa。
(11)現(xiàn)在將瀏覽器窗口關(guān)閉,然后重新打開瀏覽器,在瀏覽器端訪問succ1.jsp,瀏覽器顯示結(jié)果如圖1-4所示:

圖1-4 訪問失敗
將瀏覽器關(guān)閉,那么之前登錄后服務(wù)器創(chuàng)建的名為JSESSION的cookie就死亡了,那么對(duì)應(yīng)的session就無法獲取,session中保存的用戶名也就無法獲取。再次打開瀏覽器,訪問succ1.jsp,服務(wù)器創(chuàng)建新的session,新的session中并不存在用戶名信息,因此轉(zhuǎn)發(fā)到login.jsp,然后顯示“您還沒有登錄!請(qǐng)先登錄!“。
(12)在圖1-4中,輸入用戶名:aaa,密碼:123,然后點(diǎn)擊“登錄“,這時(shí)session中就有了用戶信息,succ2.jsp頁(yè)面與succ1.jsp一樣,所以現(xiàn)在訪問succ2.jsp可以訪問成功,如圖1-5所示:

圖1-5 訪問succ2.jsp
圖1-5中,成功的從session中獲得用戶信息,succ2.jsp訪問成功。只要瀏覽器不關(guān)閉,在一定時(shí)間內(nèi)用戶的狀態(tài)都是登錄狀態(tài),無論訪問succ1.jsp還是succ2.jsp都可以。
我們平時(shí)上網(wǎng)時(shí),第一次登錄某個(gè)網(wǎng)站點(diǎn)擊了記住用戶名,下次再訪問該網(wǎng)站時(shí),不用再輸入用戶名直接輸入密碼即可。這個(gè)是怎么做到的?其實(shí)是利用Cookie實(shí)現(xiàn)了記住用戶名的功能。下面我們就來練習(xí)如何使用cookie記住用戶名。
(13)用戶第一次登錄,如果登錄成功,將其用戶名保存在Cookie中,并且將Cookie的過期時(shí)間設(shè)置為一天后,然后發(fā)送給瀏覽器。現(xiàn)在我們對(duì)LoginServlet進(jìn)行修改,如下所示:
public void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
      ... ... 此處省略獲取請(qǐng)求參數(shù)
       if(!"itcast".equalsIgnoreCase(username)) {//登錄成功
           /*
            * 附加項(xiàng):把用戶名保存到cookie中,發(fā)送給客戶端瀏覽器
            * 當(dāng)再次打開login.jsp時(shí),login.jsp中會(huì)讀取request中的cookie,把它顯示到用戶名文本框中
            */
           Cookie cookie = new Cookie("uname", username);//創(chuàng)建Cookie
           cookie.setMaxAge(60*60*24);//設(shè)置cookie命長(zhǎng)為1天
           response.addCookie(cookie);//保存cookie
       ... ... 此處省略登錄成功處理代碼
       } else {//登錄失敗
         ... ... 此處省略例1-3中登錄失敗處理代碼
       }
    }
(14)再修改login.jsp頁(yè)面,如例1-6所示:
例1-6 login.jsp
<body>
<%
/*
讀取名為uname的Cookie!
如果為空顯示:""
如果不為空顯示:Cookie的值
*/
String uname = "";
Cookie[] cs = request.getCookies();//獲取請(qǐng)求中所有的cookie
if(cs != null) {// 如果存在cookie
    for(Cookie c : cs) {//循環(huán)遍歷所有的cookie
       if("uname".equals(c.getName())) {//查找名為uname的cookie
           uname = c.getValue();//獲取這個(gè)cookie的值,給uname這個(gè)變量
       }
    }
}
%>
... ... 此處省略1-4中代碼
<form action="/Example22/LoginServlet" method="post">
    用戶名:<input type="text" name="username" value=”<%=uname%>”/><br/>
    密 碼:<input type="password" name="password"/><br/>
    <input type="submit" value="登錄"/>
</form>
 
</body>
例1-6中,首先獲得所有Cookie,再遍歷所有Cookie,然后查找名字為uname的cookie,如果找到,將該Cookie的值賦值給uname變量,然后將uname變量的值賦給名字為username的表單項(xiàng)的value屬性。
(15)重新啟動(dòng)服務(wù)器,在瀏覽器端訪問login.jsp,輸入用戶名:zhangsan,密碼:123,然后點(diǎn)擊“登錄“按鈕,如圖1-6所示:

圖1-6 登錄
(16)登錄成功后,將瀏覽器關(guān)閉,再打開瀏覽器,再次訪問login.jsp,如圖1-7所示:

圖1-7 記住用戶名
如圖1-7所示,用戶名zhagnsan回顯在登錄頁(yè)面中,這就是記住用戶名的實(shí)現(xiàn)原理。當(dāng)時(shí)間超過一天,名字為uname的Cookie就會(huì)被瀏覽器殺死,這個(gè)時(shí)候在訪問登錄頁(yè)面,就不會(huì)回顯用戶名。

本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://www.xamj520.com/javaee

0 分享到:
和我們?cè)诰€交談!