JavaWeb詳細講述Cookie和Session的概念

1.會話

會話: 用戶打開瞭一個瀏覽器,點擊瞭很多超鏈接,訪問多個web次元,關閉瀏覽器,這個過程可以稱之為會話

有狀態會話: 帶有訪問記錄的會話

1.服務端會給客戶端一個cookie,客戶端下次訪問時攜帶cookie訪問就可以瞭 cookie

2.服務端登記客戶端訪問過,下次訪問時匹配到客戶端; session

2.保存會話的兩種技術

  • cookie

客戶端技術(響應,請求)

  • session

服務器技術,利用這個技術,可以保存用戶的會話信息,可以把信息或者數據保存在Session中。

常見場景:網站登錄之後,下次不用再登錄瞭,第二次訪問直接就上去瞭!

3.Cookie

1.從請求中拿到cookie信息

2.服務器響應給客戶端cookie

cookie相關方法:

Cookie[] cookies = req.getCookies(); //獲得cookie
cookie.getName() //獲得cookie中的鍵
cookie.getValue() //獲得cookie中的值	
new Cookie("LastLoginTime",System.currentTimeMillis()+"") //新建一個cookie
cookie.setMaxAge(24*60*60); //設置cookie有效期
resp.addCookie(cookie); //響應給客戶端一個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("第一次訪問網站");
    }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()+"");
    //設置cookie有效期為一天
    cookie.setMaxAge(24*60*60);
    resp.addCookie(cookie);
}

cookie:一般會保存在本地的用戶目錄下appdate;

一個網站cookie是否存在上限?

  • 一個cookie隻能保存一個信息;
  • 一個web網站可以給瀏覽器發送多個cookie,最多存放20個cookie;
  • cookie大小有限制4kb
  • 300個cookie瀏覽器上限

刪除cookie:

  • 不設置有效期,關閉瀏覽器,自動失效;
  • 設置有效期時間為0;

註意:在cookie的值為中文時最好使用URLEncoder.encode()來進行編碼,防止中文亂碼。取值時用URLDecoder.decode()來解碼。

4.Session

什麼事session:

  • 服務器會給每一個用戶創建一個session對象
  • 一個session獨占一個瀏覽器,隻要瀏覽器沒有關閉,這個Session就存在;
  • 用戶登錄之後,整個網站都可以訪問 –>保存用戶的信息;

Session常用的方法

Session和cookie的區別:

  • Cookie是把用戶的數據寫到用戶的瀏覽器,瀏覽器保存(可以保存多個)
  • session把用戶的數據寫到用戶獨占的Session中,服務器端保存(保存重要的信息,減少服務器資源的浪費)
  • session對象由服務器創建;

使用場景:

  • 保存一個登錄用戶的信息;
  • 購物車信息;
  • 在整個網站中經常會使用的數據,我們將它保存到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是不是新創建的
    if(session.isNew()){
        out.write("session創建成功,ID:"+id);
    }else{
        out.write("session已經存在,id:"+id);
    }
    //Session創建的時候做瞭什麼事
    //        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配置

<!--    設置Session的默認失效時間-->
    <session-config>
<!--        15分鐘後session自動失效,以分鐘為單位-->
        <session-timeout>15</session-timeout>
    </session-config>

到此這篇關於JavaWeb詳細講述Cookie和Session的概念的文章就介紹到這瞭,更多相關JavaWeb Cookie和Session內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: