cookie、session
Cookie、Session
1.会话
会话:用户打开一个浏览器,点击了很多超链接,同时访问多个web资源,再到关闭浏览器,这个过程
有状态会话:服务端给客户端一个信件, 客户端下次访问服务端的时候带上信件(Cookie);服务器登记你来过了, 下次你来的时候匹配你(Session)
2.保存会话的两种技术
Cookie
- 客户端技术(响应、请求)
Session
- 服务器技术、利用这个技术可以保存用户的信息,可以把信息或者数据放在Session中
常见场景:网站登录后第二次访问不再登录
3.Cookie
服务器先判断该请求得cookie是否存在,若不存在则创建一个cookie,用户在访问时带着cookie访问
1.从请求中拿到信息, 获得Cookie
Cookie []cookies = req.getCookie();
2.服务器响应给客户端cookie
cookie.getName() //获得cookie中的key
cookie.getValue() //获得cookie中的value
new Cookie("cookieName", "cookieValue") //新建一个cookie,如System.currentTimeMillion + ""
cookie.setMaxAge(24 * 60 * 60) //设置cookie的有效期为1天
resp.addCookie(cookie) //在响应中添加cookie
3.cookie一般会保存在本地文件AppData中
4.一个网站的cookie是否存在上限
- 一个cookie只能保存一个信息
- 一个web站点可以给浏览器发送多个cookie, 每个站点最多存20个
- 浏览器的上限为300个cookie
- cookie大小有限制,4kb
5.删除cookie
- 不设置有效期,关闭浏览器自动失效
- 设置有效期的时间为0
- 创建一个新的同名的cookie,会自动覆盖原有的cookie
6.如果在给网页中文cookie出现乱码
可以使用网络编程中的编码、解码的过程
URLEncoder.encode("content", "utf-8"); //编码进行传送
URLDecoder.decode("content", "utf-8"); //再次使用时需要解码
7.记录上次访问时间代码
package com.Gw.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
//保存用户上一次访问的时间
public class Cookie01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//服务器告诉你你来的时间,然后把这个时间封装为一个信件,下次带着来
resp.setContentType("utf-16");
req.setCharacterEncoding("utf-16");
resp.setCharacterEncoding("utf-16");
PrintWriter out = resp.getWriter();
//Cookie服务端从客户端获取, cookie可以存在多个
Cookie[] cookies = req.getCookies();
//判断cookie是否存在
if(cookies != null){
//如果存在
out.println("上一次访问的时间是:");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie1 = cookies[i];
//获取cookie的名字
if(cookie1.getName().equals("LastLoginTime")){
long lastLoginTime = Long.parseLong(cookie1.getValue());
Date date = new Date(lastLoginTime);
out.println(date.toLocaleString());
}
}
}else {
out.print("这是第一次访问网站");
}
//服务器给客户端响应一个cookie
Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis() + "");
//有效期为一天
cookie.setMaxAge(24 * 60 * 60);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
4.Session
cookie是将数据直接通过cookie传回用户,而session则是通过SessionID在
1.什么是Session:
- 服务器会给每个用户(浏览器)创建一个Session对象
- 一个Session独占一个浏览器,只要浏览器不关,Session一直有效
- 用户登陆之后,所有子网页都可以访问
2.Session中常用的一些方法及使用:
//得到Session
HttpSession session = req.getSession();
//给Session中存东西,可以在不同网页上进行存和取
session.setAttribute("obj", new Person("ygw", 20));
//从Session中取东西,注意需要强转
Person person = (Person) session.getAttribute("obj");
//注销Session
session.removeAttribute("obj");
session.invalidate();
<!--在xml中注销Session的方法:会话自动过期-->
<!--设置session的失效时间-->
<session-config>
<!--以分钟为单位,15分钟后session失效-->
<session-timeout>15</session-timeout>
</session-config>
3.Session和Cookie的区别:
- cookie是把用户的数据写给用户的浏览器保存
- session把用户的数据写到用户独占的session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
- session对象由服务器创建
4.使用场景:
- 保存一个登陆用户的信息
- 子网页的访问
- 在整个项目中经常会使用的数据
5.一些参考代码:
package com.Gw.servlet;
import pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
public class Session01 extends HttpServlet {
@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");
//得到Session
HttpSession session = req.getSession();
//给Session中存东西
session.setAttribute("obj", new Person("ygw", 20));
//获取session的id
String id = session.getId();
//判断session是不是新创建
if(session.isNew()){
resp.getWriter().write("session创建成功, id:" + id);
}else{
resp.getWriter().write("session已经在服务器中存在, id:" + id);
}
//Session创建的时候做了什么事情 -> 本质上像一个cookie
//Cookie cookie = new Cookie("JSESSIONID", "408EEFF1B5172C9AC61584CFD41023EC");
//resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
//给session设置一个对象属性
package com.Gw.servlet;
import pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class Session02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
HttpSession session = req.getSession();
Person person = (Person) session.getAttribute("obj");
System.out.println(person.toString());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
//注销session
package com.Gw.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class Session03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("obj");
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}