Cookie&Session

HTTP协议缺陷

彻底了解http协议并且要思考解决方案

1.1 HTTP的无状态性

Http协议具备无状态的特性,即当客户端请求服务器,服务器返回响应之后,客户端与服务器便再也没有任何关系了。直到下次客户端再发出新的请求。

这种特性叫做无状态

无状态的好处是可以省下大量的网络资源。

坏处是客户端和服务器端都无法准确的识别对方当前的状态。

例如:打开一个新闻页面,把网线拔了,依然可以看当前页面新闻。

但是:我们在实际使用时却发现浏览器能记住我们的操作,和HTTP的无状态时相悖的。

这种记住其实是分别由两种不同的技术实现的CookieSession

Cookie

2.1 Cookie的介绍

Cookie是一种通过服务器把数据存储到浏览器客户端的技术。

Cookie的作用是服务器通过保存数据到客户端,以及从浏览器客户端读取存储的数据,以达到持续相识的目的

这种技术又称为会话技术。

但是有一些限制:

1大小有限制,不然网站会在你电脑上存储很多乱七八糟的东西。

2不同的网站保存在客户端的信息是相互完全独立的。

3,Cookie不是永久存储的,每个cookie有个过期时间cookie默认(-1秒)随浏览器关闭而过期。

4cookie对应保存浏览器是独立的,不会共享

2.2 Cookie的使用

2.2.1 创建Cookie放值以及保存到浏览器客户端

CookieCreateTest.java

package cn.itcast.web;

 

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;

 

public class CookieCreateTest extends HttpServlet {

private static final long serialVersionUID = 1L;

 

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

this.doPost(request, response);

}

 

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

 

// 创建cookie

Cookie cookie01 = new Cookie("name", "ldh");

// 设置最大生命时常7,默认为-1,即浏览器关闭后自动失效

cookie01.setMaxAge(3600*24*7);

// cookie加入response对象后保存到本地

response.addCookie(cookie01);

Cookie cookie02 = new Cookie("pass", "ldh123");

cookie02.setMaxAge(3600*24*7);

response.addCookie(cookie02);

}

 

}

 

2.2.2 从浏览器请求中读取Cookie

CookieReadTest.java

package cn.itcast.web;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletException;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class CookieReadTest extends HttpServlet {

private static final long serialVersionUID = 1L;

 

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

this.doPost(request, response);

}

 

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

//设置响应内容编码

response.setCharacterEncoding("UTF-8");

//设置浏览器渲染方式

response.setContentType("text/html;charset=UTF-8");

//获取输出流

PrintWriter printWriter = response.getWriter();

// 从请求对象中获取所有的cookie

Cookie[] cookies = request.getCookies();

if (null != cookies && 0 != cookies.length) {

for (Cookie cookie : cookies) {

// 获取cookienamekey

String name = cookie.getName();

// 获取cookievalue

String value = cookie.getValue();

printWriter.println(name + ":" + value+"
"
);

}

}

}

 

}

2.3 流程分析:

步骤分析:

步骤一浏览器发送请求

步骤二:服务器生成cookie并且响应cookie

步骤三:浏览器自动保存cookie

步骤四浏览器再次发送请求时请求头中会携带cookie (不管第二次请求是servlet还是页面)

***********************************************

2.4 总结:

由此可以得出,Cookie的信息是保存到客户端的硬盘上,与浏览器绑定

因为保存在客户端的硬盘上,所以关闭浏览器,甚至关闭计算机,只要不换浏览器,都不会消失。

但是如果Cookie被禁用或者手动清除Cookie就不行了

3. Session

3.1 Session概述

Cookie本身是存在缺陷的

1, 如果大量的数据要保存到客户端,每次保存读取任务量繁重,并且cookie在浏览器客户端不是无限量的保存的

2, 如果用户禁用cookie则彻底无法保存数据

Session为另一种会话技术,这种技术实现了和cookie类似的功能,只是把数据保存到了服务器端。

Session一旦被创建,只要浏览器不关闭在一定的时间之内访问同一工程中所有的web资源都将共享同一个session

Session的默认失效时间为30分钟。

3.2 获取(创建)session

SessionTest.java

package cn.itcast.web;

 

import java.io.IOException;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

public class SessionTest extends HttpServlet {

private static final long serialVersionUID = 1L;

 

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

this.doPost(request, response);

}

 

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

//获取当前session,如果没有当前session则创建一个

HttpSession session = request.getSession();

//获取当前sessionid

String sessionId = session.getId();

response.getWriter().println("sessionId:"+sessionId);

}

 

}

3.4 测试Session共享

SessionTestShare.java

package cn.itcast.web;

 

import java.io.IOException;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

public class SessionTestShare extends HttpServlet {

private static final long serialVersionUID = 1L;

 

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

this.doPost(request, response);

}

 

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

// 获取当前session,如果没有当前session则创建一个

HttpSession session = request.getSession();

// 获取当前sessionid

String sessionId = session.getId();

 

response.getWriter().println("sessionId:" + sessionId);

}

 

}

总结:

1. session是和cookie相关的

2. Session创建于服务端,创建好之后有个对应的sessionid

3. 这个sessionid将通过cookie技术保存到浏览器客户端

4. 再次请求时,这个sessionid将在请求头中通过cookie再次提交给服务器

5. 由于cookie默认的生命周期是随浏览器的关闭而失效,所以只要浏览器关闭后再次请求Servlet时将无法从客户端获取sessionid

6. 进而找不到对应的session,这时如果再去获取session,则只能创建一个新的session对象





你可能感兴趣的:(JAVA)