什么是会话?
用户打开一个浏览器, 点击多个超链接, 访问服务器多个web资源, 然后关闭浏览器, 整个过程称之为一个会话
HTTP协议是一种"无状态"协议,客户浏览器与服务器建立连接,发出请求,得到响应,然后关闭连接,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录。所以容器不能辨认下一个请求和之前的请求是不是同一个请求,对于容器而言,每个请求都是新的。
使用浏览器与服务器进行会话的过程中,不可避免会产生一些数据, Web服务器没有短期记忆,如何保存这些用户数据?
cookie
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
一个cookie只能保存一个信息;一个web站点可以给浏览器发送多个cookie;不设置cookie有效期时,关闭浏览器,cookie会自动失效
下面的例子是,第一次访问会创建cookie,保存访问时间,并发给浏览器。下次访问时,如果有cookie就直接输出上次保存的时间
public class CookieDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
Cookie[] cookies = req.getCookies();
if(cookies!=null){
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
if(cookie.getName().equals("yuan")){
Long value = Long.valueOf(cookie.getValue());
String s = new Date(value).toString();
out.println(s);
}
}
}else{
out.write("您是第一次来本网站");
}
String value = String.valueOf(System.currentTimeMillis());
Cookie cook = new Cookie("yuan", value);
cook.setMaxAge(3600);
resp.addCookie(cook);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
session
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,这个session对象储存在服务器中。由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
具体实现上,客户的第一次请求,容器会生成一个唯一的会话ID,且一般通过cookie把它发回客户端,客户在以后的每一个请求中发回这个会话ID。容器看到后,就会找到匹配的会话,并把这个会话与请求关联。
session的中文就是会话,因此一般对于session有两种理解,一种是抽象理解,即最开始会话的概念,一种是保存数据的具体实现,即这个模块。
可以获取session的id,设置session属性,检测session是不是新创建的
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");
HttpSession session = req.getSession();
String id = session.getId();
session.setAttribute("name","原");
PrintWriter writer = resp.getWriter();
if(session.isNew()){
writer.write("创建成功"+id);
}else{
writer.write("已经存在"+id);
}
}
可以获取session中存储的属性
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");
HttpSession session = req.getSession();
String name = (String)session.getAttribute("name");
System.out.println(name);
}
可以移除session中的属性、清除session
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("name");
session.invalidate();
}
注意: 1、session 在服务器端,cookie 在客户端(浏览器) 2、cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。
文字部分参考: 作者:技能树IT修真院 链接:https://www.zhihu.com/question/19786827/answer/661441746
|