文章目录
JAVAweb
七、Session、Cookie
1、会话
Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
有状态会话:每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。
一个网站,怎么证明你来过?
- 服务端给客户一个信件,客户端下一次访问服务端的时候带上信件就可以了: cookie
- 服务器登记你来过了,下次你来的时候匹配你:session
2、保存会话的两种技术
cookie
- 客户端技术(响应、请求)
session
- 服务器技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或者数据放在session中;
常见例子:登录网页后下次访问不用登录;
3、Cookie
- 从请求中拿到cookie信息;
- 服务器响应给客户端cookie;
Cookie[] cookies = req.getCookies(); //获得Cookie
cookie.getName(); //获得cookie中的key
cookie.getValue(); //获得cookie中的vlaue
new Cookie("lastLoginTime", System.currentTimeMillis()+""); //新建一个cookie
cookie.setMaxAge(24*60*60); //设置cookie的有效期
resp.addCookie(cookie); //响应给客户端一个cookie
cookie知识补充:
- 一个Cookie只能保存一个信息;
- 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;
- cookie大小有限制4kb;
- 300个cookie浏览器上限;
删除cookie
- 不设置有效期,关闭浏览器,自动删除
- 设置有效期为0;
编码解码
URLDecoder.decode(cookie.getValue(),"utf-8");
Cookie cookie = new Cookie("name", URLEncoder.encode("马龙","utf-8"));
4、Session
什么是Session:
- 服务器会给每一个用户(浏览器)创建一个Session对象;
- 一个Session独占一个浏览器,只要·浏览器没有关闭,这个Session就存在;
- 用户登录后,整个网站他都可以访问,包括用户个人信息页面、投稿等;——》保存了用户的·信息
Session和cookie的区别:
-
session中保存的是对象,cookie中保存的是字符串
-
Cookie把用户的数据写给用户的浏览器,浏览器保存(客户端保存),可以保存多个;
-
Session把用户的数据写给服务器,由服务器保存,用来保存重要的信息,减少服务器资源的浪费;
-
Session对象由服务创建;
使用场景:
- 保存一个登录用户的信息;
- 购物车信息;
- 在整个网站中经常会使用到的数据,保存在session中;
Session的应用:
- 在web.xml中可以设置session失效时间,默认最大不活动时间:30分钟
<!--设置session默认的失效时间-->
<session-config>
<!--单位为分钟,以下为十分钟后session失效-->
<session-timeout>10</session-timeout>
</session-config>
- 向session中存对象
@WebServlet(name = "session" , urlPatterns = "/session")
public class SessionDemo01 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中存Person实体对象
Person p1 = new Person("马龙","帝国破坏龙",33);
Person p2 = new Person("张继科","帝国绝凶虎",33);
Person p3 = new Person("许昕","帝国食鲸鲨",30);
session.setAttribute("info1",p1);
session.setAttribute("info2",p2);
session.setAttribute("info3",p3);
//获取session的id
String sid = session.getId();
//判断Session是不是新创建的
if(session.isNew()){
resp.getWriter().write("session创建成功,id:"+sid);
}else {
resp.getWriter().write("session已经在服务器中存在,id:"+sid);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 得到session的对象
@WebServlet(name = "s2",urlPatterns = "/s2")
public class SessionDemo02 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的值
Person info = (Person) session.getAttribute("info1");
System.out.println(info);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 移除session中的对象以及注销session
@WebServlet(name = "s3",urlPatterns = "/s3")
public class SessionDemo03 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.removeAttribute("info1");
//注销Session
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}