web中的cookie管理

  本篇是以JSP為背景介紹,但是在web開發中也是相同的原理。

  什么是cookie

  由于http是一種無狀態的協議,因此服務器收到請求后,只會當做一次新的請求。即便你重復發送了1000次同樣的請求,這1000次都屬于獨立的請求。

  這樣顯然效率很低,如果要登錄某個網站,后期的操作都與用戶身份有關,難道還得沒操作一個頁面都得登錄一次?

  于是cookie和session就誕生了。

  cookie和session都是用于幫助http進行狀態管理的一種手段。

  cookie與session的區別

  cookie與session的區別可以通過下面幾點區分:

  1 保存位置:cookie保存在客戶端瀏覽器中;session保存在服務器端。

  2 生命周期:cookie由用戶指定或者使用默認的過期時間,在這段期限內cookie都保存在客戶端本地;session屬于一次會話,如果會話關閉,瀏覽器關閉,服務器啟動都會導致session的清除。

  3 數據類型:cookie其實就是一堆字符串;session是某種Object對象。

  4 安全性:cookie一般只保存一些用戶的行為習慣等等,像用戶名密碼肯定都需要經過加密的,即使泄露了也無關緊要;session則保存用戶相關的重要內容。

  cookie的使用過程

  如果要保存cookie

  首先需要創建一個Cookie對象,然后通過把它添加到response對象中,返回給客戶端即可。

  Cookie對象中的數據就自動保存在客戶端了。

  如果要使用cookie

  可以通過request對象直接查詢cookie信息,并且比對是否含有自己使用的數據。

  Cookie中常用的方法

  1 創建Cookie對象

Cookie usernameCookie = new Cookie("username",username);

  2 設置過期時間,以秒為單位

usernameCookie.setMaxAge(864000);

  3 保存cookie

response.addCookie(usernameCookie);

  4 獲取cookie數據

Cookie[] cookies = request.getCookies();

  5 提取關鍵數據

Cookie[] cookies = request.getCookies();
if(cookies!=null && cookies.length>0){for(Cookie c:cookies){if(c.getName().equals("username")){response.addCookie(c);}}
}

  JSP中cookie使用樣例

  業務場景:

  1 login.jsp登錄用戶名密碼,可以設置是否記錄cookie;如果之前登陸過,則自動填寫cookie中的信息。

  2 跳轉到doLogin.jsp界面,進行cookie的保存于清除。如果前一頁設置保存,則保存cookie信息;如果前一頁設置不保存,則清除信息。

  3 通過URL跳轉到users.jsp頁面,可以提取cookie中的相關信息。

  login.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"import="java.net.*"pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>用戶登錄</title>
</head>
<body><h1>用戶登錄</h1><hr><%request.setCharacterEncoding("utf-8");String username = "";String password = "";Cookie[] cookies = request.getCookies();if(cookies!=null && cookies.length>0){for(Cookie c:cookies){if(c.getName().equals("username")){username = URLDecoder.decode(c.getValue(),"utf-8");}if(c.getName().equals("password")){password = URLDecoder.decode(c.getValue(),"utf-8");}}}%><form name="loginForm" action="doLogin.jsp" method="post"><table><tr><td>username</td><td><input type="text" name="username" value=<%=username%>></input></td></tr><tr><td>password</td><td><input type="password" name="password" value=<%=password%>></input></td></tr><tr><td><input type="checkbox" name="isUseCookie" checked="true"/>記住登錄狀態</td></tr><tr><td colspan="2" align="center"><input type="submit" value="submit"/></td></tr></table></form>
</body>
</html>
View Code

  doLogin.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"import="java.net.*"pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>用戶登錄</title>
</head>
<body><h1>javaBeans</h1><hr><%//保證request以及response的編碼 request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");String[] isUseCookies = request.getParameterValues("isUseCookie");if(isUseCookies!=null && isUseCookies.length>0 ){//使用URLEncoder解決cookie中中文問題String username = URLEncoder.encode(request.getParameter("username"),"utf-8");String password = URLEncoder.encode(request.getParameter("password"),"utf-8");Cookie usernameCookie = new Cookie("username",username);Cookie passwordCookie = new Cookie("password",password);usernameCookie.setMaxAge(864000);passwordCookie.setMaxAge(864000);response.addCookie(usernameCookie);response.addCookie(passwordCookie);}else{Cookie[] cookies = request.getCookies();if(cookies!=null && cookies.length>0){for(Cookie c:cookies){if(c.getName().equals("username")||c.getName().equals("password")){c.setMaxAge(0);response.addCookie(c);}}}}%><a href="users.jsp" target="_blank">check user info</a>
</body>
</html>
View Code

  users.jsp

<%@ page language="java" import="java.util.*,java.io.*,java.net.*" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body><h1>cookie</h1><%request.setCharacterEncoding("utf-8");String username = "";String password = "";Cookie[] cookies = request.getCookies();if(cookies!=null && cookies.length>0){for(Cookie c:cookies){if(c.getName().equals("username")){username = URLDecoder.decode(c.getValue(),"utf-8");}if(c.getName().equals("password")){password = URLDecoder.decode(c.getValue(),"utf-8");}}}%>用戶名:<%=username %>密碼:<%=password %>
</body>
</html>
View Code

  其中關于編碼問題,可以參考:中文亂碼問題

轉載于:https://www.cnblogs.com/xing901022/p/4359732.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259209.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259209.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259209.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

unity怎么設置游戲頁面_杭州有沒有正規的unity游戲開發培訓機構?

現在Unity游戲開發是個火熱的行業&#xff0c;薪資待遇比較高&#xff0c;未來的發展方向和前景也比較不錯&#xff0c;很多人也都想成為專業Unity游戲開發工程師&#xff0c;學習Unity游戲開發已經成為很多追求更好就業前景的人的選擇。學習專業、系統的Unity游戲開發知識并達…

VC++ 使用attributes定義接口

1.定義預處理命令_ATL_ATTRIBUTES 2.在一個全局的Cpp文件里面配置module的attribute [module(dll, uuid "{3845951F-15B8-4286-8E7D-E9D4F5C7B6CE}", name "TestApp")]3.定義接口 [object,uuid("9F414A8A-1D5E-4aff-A60E-CFD65155ABB6"),dual,…

h3c 虛擬服務器 下一跳,H3CNE 312題和313題 直連路由靜態路由的下一跳問題

321.在MSR 路由器上看到路由表里有如下顯示&#xff1a; Destination/Mask Proto Pre Cost NextHop Interface 127.0.0.0/8 Direct 0 0 127.0.0.1 InLoop0 127.0.0.1/32 Direct 0 0 127.0.0.1 InLoop0 192.168.96.0/19 Direct 0 0 192.168.120.153 S6/0 那么關于目的地321.在MS…

C++成員變量的初始化順序問題

先來看兩道題&#xff1a; // count algorithm example #include <iostream> // std::cout #include <algorithm> // std::count #include <vector> // std::vector using namespace std; class A { public:A() { cout << "in A()&q…

Knockout.Js案例一Introduction

在這第一個教程中,您將體驗的一些基本知識構建的web UI Model-View-ViewModel使用knockout.js(MVVM)模式。案例1&#xff1a;添加:data-bind <p>First name: <strong data-bind"text:firstName">1</strong></p><p>Last name: <stro…

C#注冊表常用操作

1&#xff1a;加鍵 改值 Microsoft.Win32.RegistryKey Key Microsoft.Win32.Registry.CurrentUser.CreateSubKey( "Software\Microsoft\Internet Explorer\Main"); Key.SetValue( "Window Title" , value ); Key.Close(); …

谷歌瀏覽器外貿版_做外貿快兩個月,沒有單怎么辦?

Hello 大家好&#xff0c;我是Jack。今天給大家更新一篇在知乎看到的外貿問題&#xff1a;做外貿快兩個月&#xff0c;沒有單怎么辦?外貿這個話題在知乎算是小眾話題了&#xff0c;相比較于職場&#xff0c;英語學習&#xff0c;國際政治&#xff0c;IT等&#xff0c;這些話題…

React Native通信機制詳解

http://blog.cnbang.net/tech/2698/ React Native是facebook剛開源的框架&#xff0c;可以用javascript直接開發原生APP&#xff0c;先不說這個框架后續是否能得到大眾認可&#xff0c;單從源碼來說&#xff0c;這個框架源碼里有非常多的設計思想和實現方式值得學習&#xff0c…

C++11系列學習之四----auto

在哪些情況下要申明類型&#xff1a; 定義變量類型 函數返回值&#xff0c;函數參數 表達式返回變量類型 auto關鍵字原理 在定義變量的時候必須申明類型&#xff0c;c是強語言類型&#xff0c;在編譯階段需要知道類型&#xff0c;這樣的好處是程序效率更高&#xff0c;而…

windows 自動copy遠程服務器文件

net use h: \\123.45.67.000\T1dbbackup 123456/user:administrator ------遠程服務器IP123.45.67.000 。T1dbbackup&#xff1a;共享文件夾 。 h :映射到本機的盤符。 用戶名&#xff1a;administrator&#xff0c;密碼&#xff1a;123456copy h:\*.* f:\T1DB ------復…

eclipse 不能切換輸入法

按了AltShift鍵&#xff1f;再按一次把EN切換成CN&#xff0c;然后再CtrlShift就可以切換輸入法轉載于:https://www.cnblogs.com/jiayonghua/p/3413827.html

excel打開2個獨立窗口_謝楠稱女性獨立的不是錢是心 謝楠與吳京婚后生育2個兒子...

近日&#xff0c;在綜藝節目《幸福三重奏》 三日談妻子篇中&#xff0c;謝楠被問到如何看待獨立女性時&#xff0c;反問記者會不會問吳京同樣的問題&#xff1b;隨后回答道&#xff0c;女性獨立的不是錢&#xff0c;而是你的心&#xff1b;楠姐的回答超級霸氣了&#xff0c;你們…

C++11系列學習之五-------decltype

使用場景 在C中經常要用到很長的變量名&#xff0c;如果已經有變量和你將使用的變量是一個類型&#xff0c;即可使用decltype關鍵字 來申明一樣的類型變量。 decltype原理 返回現有變量類型&#xff0c;decltype是一個關鍵字&#xff0c;而不是一個函數&#xff0c;這有啥區別…

Linux學習 Unit 9

Unit9.openssh-server1.openssh-server功能&#xff1a;讓遠程主機可以通過網絡訪問sshd服務&#xff0c;開始一個安全shell2.客戶端連接方式ssh遠程主機用戶遠程主機ip[rootdesktop0 ~]# ssh root172.25.0.11The authenticity of host 172.25.0.11 (172.25.0.11) cant be esta…

2015年創業中遇到的技術問題:41-50

41.Bootstrap換行。col-md-10和col-md-2。這2個div按說應該在一行的&#xff0c;結果col-md-2換行了。看看樣式&#xff0c;發現有多余的“margin-left: 1px;"。42.Service實現類定義了一個“自動調度進行刷新”的方法。OverrideScheduled(cron "0 0/10 * * * ? &q…

KMP模板與講解

讀書筆記終于寫完了&#xff0c;寫一下我對KMP的理解。 KMP的思想就是盡量利用已經得到的信息&#xff0c;來降低時間復雜度&#xff0c;已經得到的信息存放在next數組里。算法確實很難理解&#xff0c;所以很難講解。。舉個例子來說吧。 設字符串是str[]&#xff0c;next[5] …

android 非root app 捕捉系統廣播_APP的生死之道

這篇文章主要介紹APP在安卓系統中是怎么被殺死的&#xff0c;按照怎樣的一個策略去釋放進程&#xff1b;同時介紹一些延長應用存活時間的方案&#xff0c;雖然這個在現在安卓系統上越來越難實現了&#xff0c;但是也是可以稍微了解下&#xff0c;主要也是通過這些hack的方案更好…

C++11系列學習之六-----for

前言C11這次的更新帶來了令很多C程序員期待已久的for range循環&#xff0c;每次看到javascript&#xff0c; lua里的for range&#xff0c;心想要是C能有多好&#xff0c;心里別提多酸了。這次C11不負眾望&#xff0c;再也不用羨慕別家人的for range了。使用場景ex1&#xff1…

ArcGIS Engine 10開發環境的一些常見問題(轉載)

轉自&#xff1a;http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid107612&extra&page1 許多版友在剛剛使用ArcGIS 10做開發的時候&#xff0c;都會遇到這樣那樣的問題。在擔任實習版主的這一個多月里&#xff0c;看到了這么幾個與開發環境相關的問題&#xff0c;重…

@value 靜態變量_面試官:為什么靜態方法不能調用非靜態方法和變量?

這個可能很多人之前學習jvm的時候都會遇到&#xff0c;屬于一個小問題&#xff0c;寫這篇文章的原因是我在看java相關的面試題目中遇到的&#xff0c;因此順手總結一下&#xff1a;一、例子我們先看效果&#xff1a;我們在靜態方法main中調用非靜態變量或者是方法都會報錯。我們…