彻底了解http协议并且要思考解决方案
Http协议具备无状态的特性,即当客户端请求服务器,服务器返回响应之后,客户端与服务器便再也没有任何关系了。直到下次客户端再发出新的请求。
这种特性叫做无状态。
无状态的好处是可以省下大量的网络资源。
坏处是客户端和服务器端都无法准确的识别对方当前的状态。
例如:打开一个新闻页面,把网线拔了,依然可以看当前页面新闻。
但是:我们在实际使用时却发现浏览器能记住我们的操作,和HTTP的无状态时相悖的。
这种记住其实是分别由两种不同的技术实现的Cookie和Session
Cookie是一种通过服务器把数据存储到浏览器客户端的技术。
Cookie的作用是服务器通过保存数据到客户端,以及从浏览器客户端读取存储的数据,以达到持续相识的目的
这种技术又称为会话技术。
但是有一些限制:
1,大小有限制,不然网站会在你电脑上存储很多乱七八糟的东西。
2,不同的网站保存在客户端的信息是相互完全独立的。
3,Cookie不是永久存储的,每个cookie有个过期时间,cookie默认(-1秒)随浏览器关闭而过期。
4,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);
}
}
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) {
// 获取cookie的name值 key
String name = cookie.getName();
// 获取cookie的value
String value = cookie.getValue();
printWriter.println(name + ":" + value+"
");
}
}
}
}
步骤分析:
步骤一:浏览器发送请求
步骤二:服务器生成cookie并且响应cookie
步骤三:浏览器自动保存cookie
步骤四:浏览器再次发送请求时请求头中会携带cookie (不管第二次请求是servlet还是页面)
***********************************************
由此可以得出,Cookie的信息是保存到客户端的硬盘上,与浏览器绑定。
因为保存在客户端的硬盘上,所以关闭浏览器,甚至关闭计算机,只要不换浏览器,都不会消失。
但是如果Cookie被禁用或者手动清除Cookie就不行了
Cookie本身是存在缺陷的
1, 如果大量的数据要保存到客户端,每次保存读取任务量繁重,并且cookie在浏览器客户端不是无限量的保存的
2, 如果用户禁用cookie则彻底无法保存数据
Session为另一种会话技术,这种技术实现了和cookie类似的功能,只是把数据保存到了服务器端。
Session一旦被创建,只要浏览器不关闭,在一定的时间之内访问同一工程中所有的web资源都将共享同一个session。
Session的默认失效时间为30分钟。
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();
//获取当前session的id
String sessionId = session.getId();
response.getWriter().println("sessionId:"+sessionId);
}
}
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();
// 获取当前session的id
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对象