日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Servlet】请求转发、重定向、Cookie使用之三天自动登陆

發(fā)布時間:2024/2/28 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Servlet】请求转发、重定向、Cookie使用之三天自动登陆 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

三天自動登陸項目源碼: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ā)req.setAttribute("str", "用戶名或密碼錯誤");req.getRequestDispatcher("PageServlet").forward(req, resp);return;

特點:
一次請求
地址欄信息不改變。

請求轉(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è)置,存儲在用戶電腦中。
Cookie c = new Cookie("uid", ((User) result).getUid() + "");c.setMaxAge(5 * 60);// 定時存儲5分鐘c.setPath("CookieServlet");resp.addCookie(c);

(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頁
package cn.hanquan.servlet;import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import cn.hanquan.orm.core.Query; import cn.hanquan.orm.core.QueryFactory; import cn.hanquan.orm.po.User;public class LoginServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 設(shè)置請求、響應(yīng)編碼格式req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");// 獲取請求信息String uname = req.getParameter("uname");String upwd = req.getParameter("upwd");System.out.println("獲取到uname=" + uname + "upwd=" + upwd);// 處理請求信息if (uname == null || upwd == null) {// 避免直接訪問此頁報空指針resp.sendRedirect("PageServlet");return;}User u = new User();u.setUname(uname);u.setUpwd(upwd);Query q = QueryFactory.createQuery();Object result = q.queryUniqueRow("select * from user where uname=? and upwd=?", User.class,new String[] { uname, upwd });System.out.println(result);// 登錄結(jié)果if (result != null) {// rightCookie c = new Cookie("uid", ((User) result).getUid() + "");c.setMaxAge(5 * 60);c.setPath("CookieServlet");resp.addCookie(c);// 請求轉(zhuǎn)發(fā)req.setAttribute("uname", u.getUname());req.getRequestDispatcher("MainServlet").forward(req, resp); // // 重定向 // resp.sendRedirect("MainServlet");return;} else {// wrong// 請求轉(zhuǎn)發(fā)req.setAttribute("str", "用戶名或密碼錯誤");req.getRequestDispatcher("PageServlet").forward(req, resp);return;}} }

(4)CookieServlet

緩存檢測界面

  • 如果有之前登錄記錄的緩存數(shù)據(jù)uid,則二次驗證用戶是否存在,然后重定向至MainServlet頁
package cn.hanquan.servlet;import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import cn.hanquan.orm.core.Query; import cn.hanquan.orm.core.QueryFactory; import cn.hanquan.orm.po.User;public class CookieServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");Cookie[] cks = req.getCookies();if (cks != null) {String uid = "";for (Cookie c : cks) {if ("uid".equals(c.getName())) {uid = c.getValue();}}if ("".equals(uid)) {// 部分cookie被用戶刪除req.setAttribute("str", "你清理了cookie嗎");req.getRequestDispatcher("page").forward(req, resp);return;} else {// 二次驗證用戶存在User u = new User();u.setUid(Integer.parseInt(uid));Query q = QueryFactory.createQuery();Object result = q.queryUniqueRow("select * from user where uid=?", User.class, new String[] { uid });if (result != null) {resp.sendRedirect("MainServlet");return;} else {req.setAttribute("str", "你似乎不在數(shù)據(jù)庫里了");req.getRequestDispatcher("/PageServlet").forward(req, resp);return;}}} else {req.getRequestDispatcher("page").forward(req, resp);return;}} }

5、運行效果示例

(1)數(shù)據(jù)庫表結(jié)構(gòu)

(2)登錄頁面

(3)成功登錄結(jié)果頁面


總結(jié)

以上是生活随笔為你收集整理的【Servlet】请求转发、重定向、Cookie使用之三天自动登陆的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。