【Servlet】请求转发、重定向、Cookie使用之三天自动登陆
三天自動登陸項目源碼:GitHub地址-LoginSystem
- JDBC
- 手寫SORM框架
- 手寫Servlet
- 開發(fā)環(huán)境:Eclipse
一、請求亂碼問題解決
// 設(shè)置請求、響應(yīng)編碼格式req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");二、Servlet 的使用流程總結(jié)
Servlet 的使用流程
(1)設(shè)置請求編碼格式
(2)設(shè)置響應(yīng)編碼格式
(3)獲取請求信息
(4)處理請求信息
(5)響應(yīng)處理結(jié)果
數(shù)據(jù)流轉(zhuǎn)流程
瀏覽器------>服務(wù)器------->數(shù)據(jù)庫
瀏覽器<------服務(wù)器<-------數(shù)據(jù)庫
三、請求轉(zhuǎn)發(fā)、重定向、Cookie學(xué)習(xí)筆記
1、請求轉(zhuǎn)發(fā)
問題:
服務(wù)器在接收到瀏覽器的請求后,僅僅使用一個Servlet 進行請求處理,會造成不同的Servlet 邏輯代碼冗余,Servlet 的職責(zé)不明確。
解決:
使用請求轉(zhuǎn)發(fā)。
特點:
一次請求
地址欄信息不改變。
請求轉(zhuǎn)發(fā)中,Request 對象作用域
問題:
使用請求轉(zhuǎn)發(fā)后,不同的Servlet 之間怎么進行數(shù)據(jù)的共享呢?或者說數(shù)據(jù)怎么從一個servlet 流轉(zhuǎn)給另外一個Servlet 呢?
解決:
使用request 對象的作用域
使用:
//發(fā)送request的servlet request.setAttribute(Object name,Object value);//接收request的servlet request.getAttribute(Object obj);作用:
解決了一次請求內(nèi)的不同Servlet 的數(shù)據(jù)(請求數(shù)據(jù)+其他數(shù)據(jù))共享問題。
作用域:
基于請求轉(zhuǎn)發(fā),一次請求中的所有Servlet 共享。
注意:
使用Request 對象進行數(shù)據(jù)流轉(zhuǎn),數(shù)據(jù)只在一次請求內(nèi)有效。
特點:
服務(wù)器創(chuàng)建
每次請求都會創(chuàng)建
生命周期一次請求
2、重定向
問題:
如果當(dāng)前的請求,Servlet 無法進行處理怎么辦?
如果使用請求轉(zhuǎn)發(fā),造成表單數(shù)據(jù)重復(fù)提交怎么辦?
解決:
使用重定向
使用:
response.sendRedirect(“路徑”).
本地路徑為:uri
網(wǎng)絡(luò)路徑為:定向資源的URL 信息
特點:
兩次請求
瀏覽器地址欄信息改變
避免表單重復(fù)提交
3、Cookie
目前大家對于瀏覽器和服務(wù)器的交互模式,以及請求的處理都有了理解,并且也能夠進行請求的處理。本節(jié)課圍繞整個流程再次進行技術(shù)優(yōu)化,重點學(xué)習(xí) Cookie 技術(shù),此技術(shù)的應(yīng)用面是非常廣的。
問題:
HTTP 協(xié)議是沒有記憶功能的,一次請求結(jié)束后,相關(guān)數(shù)據(jù)會被銷毀。
如果第二次的請求需要使用相同的請求數(shù)據(jù)怎么辦呢?
難道是讓用戶再次請求書寫嗎?
解決:
使用Cookie 技術(shù)
解釋:
Cookie 技術(shù)其實是瀏覽器端的數(shù)據(jù)存儲技術(shù),解決了不同請求需要使用相同的請求數(shù)據(jù)的問題。
我們把請求需要共享的請求數(shù)據(jù),存儲在瀏覽器端,避免用戶進行重復(fù)的書寫請求數(shù)據(jù)。
但是哪些數(shù)據(jù)需要使用Cookie 技術(shù)存儲起來是一個主觀問題,需要在后臺進行響應(yīng)的時候來告訴瀏覽器,有些數(shù)據(jù)其他請求還會使用,需要存儲起來。
特點:
瀏覽器端的數(shù)據(jù)存儲技術(shù)
適合少量數(shù)據(jù)
鍵值對
不安全
使用:
(1)Cookie 數(shù)據(jù)存儲:
- 臨時存儲:不設(shè)置cookie 信息的存儲時間,周期為一次會話,存儲在瀏覽器內(nèi)存中
- 定時存儲:設(shè)置存儲時間,周期為時間設(shè)置,存儲在用戶電腦中。
(2)Cookie 數(shù)據(jù)獲取:
Cookie[] cks = req.getCookies();總結(jié):
Cookie 技術(shù)解決了不同請求發(fā)送之間的數(shù)據(jù)共享問題。
4、Cookie 學(xué)習(xí)案例之三天免登錄
(1)PageServlet.java
用于打印html登錄頁面
package cn.hanquan.servlet;import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class PageServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");String str = (String) req.getAttribute("str") == null ? "" : (String) req.getAttribute("str");// 錯誤提示resp.getWriter().write("<html>");resp.getWriter().write("<head>");resp.getWriter().write("</head>");resp.getWriter().write("<body>");resp.getWriter().write("<font color='red' size='20px'>" + str + "</font>");resp.getWriter().write("<form action='LoginServlet' method='get'>");resp.getWriter().write("用戶名:<input type='text' name='uname' value=''/><br/>");resp.getWriter().write("密碼:<input type='password' name='upwd' value=''/><br/>");resp.getWriter().write("<input type='submit' value='登錄'/><br/>");resp.getWriter().write("</form>");resp.getWriter().write("</body>");resp.getWriter().write("</html>");} }(2)MainServlet.java
登陸成功后的歡迎界面
package cn.hanquan.servlet;import java.io.IOException;import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class MainServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {// 設(shè)置請求、響應(yīng)編碼格式req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");// 獲取請求信息// 處理請求信息// 響應(yīng)處理結(jié)果resp.getWriter().write("<html>");resp.getWriter().write("<head>");resp.getWriter().write("</head>");resp.getWriter().write("<body>");resp.getWriter().write("<h3>歡迎 " + req.getParameter("uname") + " 訪問尚學(xué)堂管理系統(tǒng)</h3>"); // 只有請求轉(zhuǎn)發(fā)才有效resp.getWriter().write("<hr>");resp.getWriter().write("</body>");resp.getWriter().write("</html>");} }(3)LoginServlet.java
點擊登錄按鈕后的檢測界面
- 如果直接訪問/登錄失敗,將重定向至PageServlet頁
- 如果登陸成功,則重定向至MainServlet頁
(4)CookieServlet
緩存檢測界面
- 如果有之前登錄記錄的緩存數(shù)據(jù)uid,則二次驗證用戶是否存在,然后重定向至MainServlet頁
5、運行效果示例
(1)數(shù)據(jù)庫表結(jié)構(gòu)
(2)登錄頁面
(3)成功登錄結(jié)果頁面
總結(jié)
以上是生活随笔為你收集整理的【Servlet】请求转发、重定向、Cookie使用之三天自动登陆的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Servlet】response对象给
- 下一篇: 【Servlet】Session的特点和