漢川市建設(shè)局網(wǎng)站網(wǎng)絡(luò)營銷的優(yōu)化和推廣方式
目錄
會話管理預(yù)習(xí)報告
一、實驗?zāi)康?/p>
二、實驗原理
三、實驗預(yù)習(xí)內(nèi)容
1. 什么是會話,一個會話的生產(chǎn)周期從什么時候,到什么時候結(jié)束?
2. 服務(wù)器是如何識別管理屬于某一個特定客戶的會話的?
3. 什么是Cookie,它的作用是什么?Cookie會給客戶端帶來安全隱患嗎?
4.如何使用隱藏表單域傳遞會話信息,一般用在什么情況下?
會話管理實驗報告
一、實驗?zāi)康?/p>
二、實驗要求
三、實驗內(nèi)容與步驟
1. 使用HttpSession對象管理會話。在名為exp04的Web項目下,創(chuàng)建一個名為ShowSessionInfo的Servlet,顯示當(dāng)前客戶的會話ID、會話創(chuàng)建時間、最近一次訪問會話的時間、該客戶訪問會話次數(shù)等信息,運行的結(jié)果要求如下圖所示。
2. 使用HttpSession會話對象設(shè)計一個GuessNumberServlet.java,實現(xiàn)簡單的猜數(shù)游戲:
4. 編寫HomeServlet.java,對通過超鏈接請求的兩個URL進行重寫,在瀏覽器中禁用Cookie后,servlet運行效果要求如下圖所示。
四、思考題
1. 如何理解會話失效與超時?如何通過程序設(shè)置最大失效時間?如何通過Web應(yīng)用程序部署描述文件設(shè)置最大超時時間?二者有什么區(qū)別?
2. 能否通過客戶機的IP地址實現(xiàn)會話跟蹤?
3. 假如開發(fā)的Web應(yīng)用程序是假設(shè)客戶支持Cookie的,但應(yīng)用程序部署后,你發(fā)現(xiàn)大多數(shù)客戶禁用了Cookie,這對應(yīng)用程序有何影響?如何修改它?
會話管理預(yù)習(xí)報告
一、實驗?zāi)康?/strong>
1. 了解Web服務(wù)器對客戶會話跟蹤的各種方法;
2. 重點掌握使用HttpSession對象跟蹤會話的方法;
3. 掌握使用Cookie技術(shù)跟蹤會話的方法;
4. 了解URL重寫和隱藏表單域的方法。
二、實驗原理
HTTP協(xié)議是無狀態(tài)的協(xié)議。在很多情況下,Web服務(wù)器必須能夠跟蹤客戶的狀態(tài)。比如,對于一個購物網(wǎng)站,在一個時刻可能有多個客戶購物,Web服務(wù)器必須能夠區(qū)分不同的客戶。一般情況下,Web服務(wù)器為每個客戶配置了虛擬的購物車(ShoppingCart)。當(dāng)某個客戶請求將一個商品放入購物車時,Web服務(wù)器必須根據(jù)發(fā)出請求的客戶的身份,找到該客戶的購物車,然后把商品放入其中。
Web服務(wù)器跟蹤客戶的狀態(tài)通常有4種方法:
(1)使用HttpSession對象管理會話;(2)使用持久的Cookie對象;(3)使用URL重寫機制;(4)使用隱藏的表單域。
三、實驗預(yù)習(xí)內(nèi)容
1. 什么是會話,一個會話的生產(chǎn)周期從什么時候,到什么時候結(jié)束?
會話:是客戶與服務(wù)器之間的不中斷的請求-響應(yīng)序列。
開始:當(dāng)一個未知的客戶向web應(yīng)用程序發(fā)送第一個請求時就開始了一個會話。
結(jié)束:當(dāng)客戶結(jié)束會話或服務(wù)器在一定時限內(nèi)沒有接到客戶任何請求時,會話結(jié)束。
2. 服務(wù)器是如何識別管理屬于某一個特定客戶的會話的?
一個客戶對應(yīng)一個會話,服務(wù)器能夠識別出請求來自于哪個客戶的會話。
3. 什么是Cookie,它的作用是什么?Cookie會給客戶端帶來安全隱患嗎?
Cookie:是客戶訪問Web服務(wù)器時,服務(wù)器在客戶端用戶硬盤上存放的信息,好像是服務(wù)器送給客戶的“點心”。Cookie實際上是一小段的文本信息。
作用:可以在客戶端上保存用戶數(shù)據(jù),起到簡單的緩存和用戶身份識別等作用;保存用戶的登陸狀態(tài),用戶進行登陸,成功登陸后,服務(wù)器生成特定的cookie返回給客戶端,客戶端下次訪問該域名下的任何頁面,將該cookie的信息發(fā)送給服務(wù)器,服務(wù)器經(jīng)過檢驗,來判斷用戶是否登陸;記錄用戶的行為。
安全問題:客戶可能認(rèn)為Cookie會帶來安全問題,因此禁用Cookie。事實上,Cookie并不會造成嚴(yán)重的安全威脅。Cookie永遠(yuǎn)不會以任何方式執(zhí)行,因此也不會帶來病毒或攻擊你的系統(tǒng)。另外,由于瀏覽器一般只允許存放300個Cookie,每個站點的Cookie最多存放20個,每個Cookie的大小限制為4 KB,因此Cookie不會塞滿你的硬盤,更不會被用作“拒絕服務(wù)”攻擊手段。
4.如何使用隱藏表單域傳遞會話信息,一般用在什么情況下?
在HTML頁面中,可以使用下面代碼實現(xiàn)隱藏的表單域:
?<input type="hidden" name="session" value="a1234">;
當(dāng)表單提交時,瀏覽器將指定的名稱和值包含在GET或POST的數(shù)據(jù)中。這個隱藏域可以用來存儲有關(guān)會話的信息。
會話管理實驗報告
一、實驗?zāi)康?/strong>
1. 了解Web服務(wù)器對客戶會話跟蹤的各種方法;
2. 重點掌握使用HttpSession對象跟蹤會話的方法;
3. 掌握使用Cookie技術(shù)跟蹤會話的方法;
4. 了解URL重寫和隱藏表單域的方法。
二、實驗要求
1. 實驗前進行預(yù)習(xí),完成實驗預(yù)習(xí)報告;
2.按照每一項實驗內(nèi)容進行上機實踐與編程,將程序源代碼和運行結(jié)果圖附在實驗報告中實驗內(nèi)容對應(yīng)的部分。
3. 實驗預(yù)習(xí)報告和實驗報告打印裝訂在一起。
4. 將每一次實驗的源代碼按目錄組織保存并壓縮,按照老師指定的要求進行提交。代碼保存方式如:exp04表示實驗四的Web項目的名稱,其下保存各項實驗內(nèi)容的源文件及相關(guān)資源,將整個exp04文件夾進行壓縮后命名為班級-姓名-實驗04,如計171-張三-實驗04。
三、實驗內(nèi)容與步驟
1. 使用HttpSession對象管理會話。在名為exp04的Web項目下,創(chuàng)建一個名為ShowSessionInfo的Servlet,顯示當(dāng)前客戶的會話ID、會話創(chuàng)建時間、最近一次訪問會話的時間、該客戶訪問會話次數(shù)等信息,運行的結(jié)果要求如下圖所示。
?
package exp04;import javax.servlet.ServletException; import javax.servlet.ServletResponse; 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; import java.io.IOException; import java.io.PrintWriter; import java.sql.Date;@WebServlet(name = "ShowSessionInfo", value = "/Show") public class ShowSessionInfo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=gb2312");HttpSession session = req.getSession(true);String heading = null;String info = "Information about your session";Integer accessCount = (Integer) session.getAttribute("accessCount");if (accessCount == null) {accessCount = new Integer(1);heading = "Welcome,enter this page first time! ";} else {heading = "Welcome Back! ";accessCount = accessCount + 1;}session.setAttribute("accessCount",accessCount);PrintWriter out = resp.getWriter();out.println("<HTML>");out.println(" <BODY><center>");out.println("<h2>"+heading + "</h2>" +"<h3>" +info+"</h3>");out.println("<table border='0'>");out.println("<tr bgcolor=\"ffad0\"><td><b>Info Type</b><td><b>Value</b>\n");out.println("<tr><td>ID:<td>"+session.getId()+"\n");out.println("<tr><td>Creation Time:<td>");out.println(""+new Date(session.getCreationTime())+"\n");out.println("<tr><td>Time of last access:<td>");out.println(""+new Date(session.getLastAccessedTime())+"\n");out.println("<tr><td>Access number:<td>"+accessCount+"\n");out.println("</table>");out.println(" </center> </BODY>");out.println("</HTML>");} }
?
?
2. 使用HttpSession會話對象設(shè)計一個GuessNumberServlet.java,實現(xiàn)簡單的猜數(shù)游戲:
doget()方法顯示當(dāng)前會話的相關(guān)信息,產(chǎn)生一個1-100的隨機數(shù)并保存到session作用域中,顯示表單讓用戶輸入所猜數(shù)字,表單以post方式提交給該servlet本身進行處理。
dopost()方法中將用戶輸入的數(shù)字和session中保存的隨機數(shù)進行比較,如果用戶猜的結(jié)果正確,強制結(jié)束會話,通過超鏈接可以在此請求該Servlet重新開始一輪猜數(shù)游戲;如果結(jié)果錯誤,顯示錯誤提示信息和猜數(shù)表單,允許用戶重新猜數(shù)。
package exp04;import java.io.IOException; import java.io.PrintWriter;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;@WebServlet(name = "GuessNumberServlet",value = "/GuessNumberServlet") public class GuessNumberServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {int num1 = (int)(Math.random()*101);HttpSession session = req.getSession();session.setAttribute("num",new Integer(num1));resp.setContentType("text/html;charset=utf-8");PrintWriter out = resp.getWriter();out.println("<html><body>");out.println("請猜一個0-100的數(shù)字!");out.println("<form action='GuessNumberServlet' method='post'>");out.println("<input type='text' name='guess' />");out.println("<input type='submit' value='提交'/>");out.println("</form>");out.println("</body></html>");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {int guess = Integer.parseInt(req.getParameter("guess"));HttpSession session = req.getSession();int magic = (Integer)session.getAttribute("num");resp.setContentType("text/html;charset=utf-8");PrintWriter out = resp.getWriter();out.println("<html><body>");if(guess==magic){session.invalidate();out.println("猜對了!");out.println("<a href = 'GuessNumberServlet'>再猜一次.</a>");}else if(guess>magic){out.println("猜大了, 請重猜!");}else{out.println("猜小了, 請重猜!");}out.println("<form action='GuessNumberServlet' method='post'>");out.println("<input type='text' name='guess' />");out.println("<input type='submit' value='確定'/>");out.println("</form>");out.println("</body></html>");} }
?
?
?
?
?
?
?3. 編寫一個CheckUserServlet,通過Cookie實現(xiàn)自動登錄的功能。當(dāng)用戶以get方式請求該Servlet時,判斷來自請求的cookie中是否包含用戶的登錄名和口令,如果有判斷是否合法,如果通過驗證顯示歡迎信息;否則顯示登錄表單讓用戶重新填寫用戶名和口令,表單提交以post方式請求CheckUserServlet進行處理,如果用戶登錄成功并且勾選了“自動登錄”,則提示登錄成功,并向客戶端發(fā)送cookie信息保存用戶名和口令,否則提示登錄失敗,并在瀏覽器端顯示登錄表單讓用戶重新登錄。
Checka.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>login</title> </head> <body> ${sessionScope.message}<br> <form action="CheckUserServlet" method="post">請您輸入用戶名和口令:<br>用戶名:<input type="text" name="username"/><br>口令:<input type="password" name="password"/><br><input type="checkbox" name="check" value="check"/>自動登錄<br><input type="submit" value="提交"/><input type="reset" value="重置"/> </form> </body> </html> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>welcome</title> </head> <body> <h1>歡迎你</h1> </body> </html>
CheckUserServlet:
package exp04;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;@WebServlet("/CheckUserServlet") public class CheckUserServlet extends HttpServlet {String message=null;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=UTF-8");String value1 = "",value2="";Cookie cookie =null;Cookie[] cookies = req.getCookies();if(cookies!=null){for(int i=0;i<cookies.length;i++){cookie = cookies[i];if(cookie.getName().equals("username")){value1 = cookie.getValue();}if(cookie.getName().equals("password")){value2 = cookie.getValue();}}if (value1.equals("little bears")&&value2.equals("123456")){message = "Welcome!!!(*?▽?*)歡迎您!"+value1+"再次登錄該頁面!";req.getSession().setAttribute("message",message);resp.sendRedirect("check_second.jsp");}else {resp.sendRedirect("check_first.jsp");}}else {resp.sendRedirect("check_first.jsp");}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=UTF-8");String username = req.getParameter("username").trim();String password = req.getParameter("password").trim();if (!username.equals("little bears")||!password.equals("123456")){message = "o(╥﹏╥)o用戶名或口令不正確,請重試!";req.getSession().setAttribute("message",message);resp.sendRedirect("check_first.jsp");}else {if ((req.getParameter("check")!=null) && (req.getParameter("check").equals("check"))){Cookie nameCookie = new Cookie("username",username);Cookie pswdCookie = new Cookie("password",password);nameCookie.setMaxAge(60*60);pswdCookie.setMaxAge(60*60);resp.addCookie(nameCookie);resp.addCookie(pswdCookie);}message ="Welcome!!!(*?▽?*)登錄成功!";req.getSession().setAttribute("message",message);resp.sendRedirect("check_second.jsp");}} }
check_first.html
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>login</title> </head> <body> ${sessionScope.message}<br> <form action="CheckUserServlet" method="post">請您輸入用戶名和口令:<br>用戶名:<input type="text" name="username"/><br>口令:<input type="password" name="password"/><br><input type="checkbox" name="check" value="check"/>自動登錄<br><input type="submit" value="提交"/><input type="reset" value="重置"/> </form> </body> </html>
check_second.html
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>welcome</title> </head> <body> <h1>歡迎你</h1> </body> </html>
首次登錄
選擇自動登錄再次打開,已經(jīng)被記憶
密碼或者用戶名錯誤
?
4. 編寫HomeServlet.java,對通過超鏈接請求的兩個URL進行重寫,在瀏覽器中禁用Cookie后,servlet運行效果要求如下圖所示。
package exp04;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 java.io.IOException; import java.io.PrintWriter;@WebServlet("/HomeServlet") public class HomeServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html; charset = utf - 8"); //HttpSession session=request.getSession();PrintWriter out = resp.getWriter();String url1 = resp.encodeURL("GuessNumberServlet");String url2 = resp.encodeURL("CheckUserServlet");out.println("<HTML>");out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");out.println(" <BODY>");out.print(" A test page showing two URLs:<br> ");out.println("<a href=\"" + url1 + "\">View GuessNumber Servlet</a><br>");out.println("<a href=\"" + url2 + "\">View CheckUser Servlet</a><br>");out.println(" </BODY>");out.println("</HTML>");} }
四、思考題
1. 如何理解會話失效與超時?如何通過程序設(shè)置最大失效時間?如何通過Web應(yīng)用程序部署描述文件設(shè)置最大超時時間?二者有什么區(qū)別?
當(dāng)用戶在一個指定的期限內(nèi)處于不活動狀態(tài)時,就將用戶的會話終止,會話失效,超過設(shè)定時間終止是會話超時。public void setMaxInactiveInterval(int Interval)設(shè)置最大失效時間。在部署文件中下中設(shè)置最大超時時間。一個是通過編程方式設(shè)置,一個是在部署時就已設(shè)置。
2. 能否通過客戶機的IP地址實現(xiàn)會話跟蹤?
容器不能使用客戶的IP地址唯一標(biāo)識客戶。因為是通過局域網(wǎng)訪問Internet盡管在局域網(wǎng)中每個客戶有一個IP地址,但對于服務(wù)器來說,客戶的實際IP地址是路由器的IP地址,所以該局域網(wǎng)的所有客戶的IP地址都相同。
3. 假如開發(fā)的Web應(yīng)用程序是假設(shè)客戶支持Cookie的,但應(yīng)用程序部署后,你發(fā)現(xiàn)大多數(shù)客戶禁用了Cookie,這對應(yīng)用程序有何影響?如何修改它?
來自網(wǎng)站的所有Cookie都被阻止,并且計算機上現(xiàn)有的Cookie不能被網(wǎng)站讀取??稍贗nternet選項中設(shè)置。