JavaWeb詳細講述Cookie和Session的概念
1.會話
會話: 用戶打開了一個瀏覽器,點擊了很多超鏈接,訪問多個web次元,關(guān)閉瀏覽器,這個過程可以稱之為會話
有狀態(tài)會話: 帶有訪問記錄的會話
1.服務(wù)端會給客戶端一個cookie,客戶端下次訪問時攜帶cookie訪問就可以了 cookie
2.服務(wù)端登記客戶端訪問過,下次訪問時匹配到客戶端; session
2.保存會話的兩種技術(shù)
- cookie
客戶端技術(shù)(響應(yīng),請求)
- session
服務(wù)器技術(shù),利用這個技術(shù),可以保存用戶的會話信息,可以把信息或者數(shù)據(jù)保存在Session中。
常見場景:網(wǎng)站登錄之后,下次不用再登錄了,第二次訪問直接就上去了!
3.Cookie
1.從請求中拿到cookie信息
2.服務(wù)器響應(yīng)給客戶端cookie

cookie相關(guān)方法:
Cookie[] cookies = req.getCookies(); //獲得cookie
cookie.getName() //獲得cookie中的鍵
cookie.getValue() //獲得cookie中的值
new Cookie("LastLoginTime",System.currentTimeMillis()+"") //新建一個cookie
cookie.setMaxAge(24*60*60); //設(shè)置cookie有效期
resp.addCookie(cookie); //響應(yīng)給客戶端一個cookie
案例:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解決中文亂碼
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
Cookie[] cookies = req.getCookies();
//判斷cookie是否存在
if(cookies == null){
out.println("第一次訪問網(wǎng)站");
}else{
out.write("您上一次訪問的時間是:");
for (Cookie cookie : cookies) {
if("LastLoginTime".equals(cookie.getName())){
//獲取cookie中的值
long time = Long.parseLong(cookie.getValue());
Date date = new Date(time);
DateFormat dfd = DateFormat.getDateInstance(DateFormat.MEDIUM,Locale.CHINA);
DateFormat dft = DateFormat.getTimeInstance(DateFormat.MEDIUM, Locale.CHINA);
out.write(dfd.format(date)+dft.format(date));
}
}
}
Cookie cookie = new Cookie("LastLoginTime",System.currentTimeMillis()+"");
//設(shè)置cookie有效期為一天
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
}
cookie:一般會保存在本地的用戶目錄下appdate;
一個網(wǎng)站cookie是否存在上限?
- 一個cookie只能保存一個信息;
- 一個web網(wǎng)站可以給瀏覽器發(fā)送多個cookie,最多存放20個cookie;
- cookie大小有限制4kb
- 300個cookie瀏覽器上限
刪除cookie:
- 不設(shè)置有效期,關(guān)閉瀏覽器,自動失效;
- 設(shè)置有效期時間為0;
注意:在cookie的值為中文時最好使用URLEncoder.encode()來進行編碼,防止中文亂碼。取值時用URLDecoder.decode()來解碼。
4.Session
什么事session:
- 服務(wù)器會給每一個用戶創(chuàng)建一個session對象
- 一個session獨占一個瀏覽器,只要瀏覽器沒有關(guān)閉,這個Session就存在;
- 用戶登錄之后,整個網(wǎng)站都可以訪問 -->保存用戶的信息;

Session常用的方法

Session和cookie的區(qū)別:
- Cookie是把用戶的數(shù)據(jù)寫到用戶的瀏覽器,瀏覽器保存(可以保存多個)
- session把用戶的數(shù)據(jù)寫到用戶獨占的Session中,服務(wù)器端保存(保存重要的信息,減少服務(wù)器資源的浪費)
- session對象由服務(wù)器創(chuàng)建;
使用場景:
- 保存一個登錄用戶的信息;
- 購物車信息;
- 在整個網(wǎng)站中經(jīng)常會使用的數(shù)據(jù),我們將它保存到Session中;
使用session:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解決亂碼
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
//得到Session
HttpSession session = req.getSession();
//給session中存東西
session.setAttribute("name",new Person("張三",18));
//獲取session的id
String id = session.getId();
//判斷session是不是新創(chuàng)建的
if(session.isNew()){
out.write("session創(chuàng)建成功,ID:"+id);
}else{
out.write("session已經(jīng)存在,id:"+id);
}
//Session創(chuàng)建的時候做了什么事
// Cookie jsessionid = new Cookie("JSESSIONID", id);
// resp.addCookie(jsessionid);
}
//Person類
public class Person {
private String name;
private int age;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}獲取session中的信息
//得到Session
HttpSession session = req.getSession();
Person name = (Person) session.getAttribute("name");
System.out.println(name);注銷session
//得到Session
HttpSession session = req.getSession();
session.removeAttribute("name");
//注銷session
session.invalidate();
會話自動過期:web.xml配置
<!-- 設(shè)置Session的默認失效時間-->
<session-config>
<!-- 15分鐘后session自動失效,以分鐘為單位-->
<session-timeout>15</session-timeout>
</session-config>到此這篇關(guān)于JavaWeb詳細講述Cookie和Session的概念的文章就介紹到這了,更多相關(guān)JavaWeb Cookie和Session內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 處理高并發(fā)負載類優(yōu)化方法案例詳解
這篇文章主要介紹了Java 處理高并發(fā)負載類優(yōu)化方法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08
SpringData JPA中查詢接口Repository的使用
本文主要介紹了SpringData JPA中查詢接口Repository的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07
Java報錯:Error:java:?程序包org.springframework.boot不存在解決辦法
建完springboot項目時,點擊啟動,有可能會報錯,下面這篇文章主要給大家介紹了關(guān)于Java報錯:Error:java:?程序包org.springframework.boot不存在的解決辦法,需要的朋友可以參考下2024-02-02
SpringBoot項目接入Nacos的實現(xiàn)步驟
SpringBoot項目使用nacos作為配置中心和服務(wù)注冊中心,同時兼容dubbo的注冊中心。 本Demo項目使用的SpringBoot版本是2.3.9.RELEASE2021-05-05
Java List Object[]轉(zhuǎn)換成List T的實例
這篇文章主要介紹了Java List Object[]轉(zhuǎn)換成List T的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09

