Web中的一次 会话
会话:用户打开浏览器,点击多个超链接,访问多个web资源,关闭浏览器,这个过程就是一次会话
保存会话的两种方式
区别 | Cookie | Session |
---|---|---|
存在 | Cookie是客户端技术,通常保存在客户端 | Session是服务器端技术,在服务端,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务 |
存储数据 | 只能存String类型的数据 | 能够存储任意Object类型的数据对象 |
性能 | Cookie存在客户端对服务器没影响 | Session过多时会消耗服务器资源,大型网站会有专门Session服务器 |
作用域 | Cookie通过设置指定作用域只能在指定作用域有效 | Session在整个网页都有效 |
作用时间 | Cookie可以通过 setMaxAge设置有效时间,即使浏览器关闭了仍然存在 | 关闭网页Session就结束了 |
实现原理
Cookie的实现原理:
Session的实现原理:
常用方法
Cookie 中常用方法:
public Cookie(String name, String value) | 构造方法 |
---|---|
public String getName() | 获得Cookie中的name |
public String getValue() | 获得Cookie中的value |
public void setMaxAge(int expiry) | 设置Cookie的最大保存时间,即cookie的有效期 |
resp.addCookie(cookie) | 服务端响应给客户端一个Cookie |
Cookie[] cookies = req.getCookies() | 获得Cookie,可能有多个 |
实例代码:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
// Cookie,服务端从客户端获取
Cookie[] cookies = req.getCookies(); // Cookie可能存在多个
// 判断Cookie是否存在
if (cookies==null||cookies.length<=3){ // 我的谷歌浏览器默认有三个Cookie
writer.println("这是你第一次访问本站");
}else {
writer.println("上次访问时间:");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
if (cookie.getName().equals("lastLoginTime")){
// 获取Cookie中的值
Date date = new Date(Long.parseLong(URLDecoder.decode(cookie.getValue(),"UTF-8"))); // URLDecoder.decode设置解码
writer.write(date.toLocaleString());
}
}
}
// 服务端给客户端响应一个Cookie URLEncoder.encode设置编码
Cookie cookie = new Cookie("lastLoginTime", URLEncoder.encode(System.currentTimeMillis()+"","UTF-8")); // Cookie以name/value对的形式保存信息
//cookie.setMaxAge(24*60*60); // 设置Cookie的有效期为一天
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
Cookie要点:
① 一个Cookie只能保存一个信息
② 一个web站点(服务端)可以浏览器(客户端)发送多个Cookie
③Cookie的大小有限制4Kb
删除Cookie:
① 不设置有效期,关闭浏览器,Cookie自动失效
② 设置Cookie的有效期为0 cookie.setMaxAge(0)
③ 在浏览器“Developer tools”中的“Application”找到对应Cookie手动删除
要想在cookie中存储中文:
① 使用URLEncoder.encode(String s,String enc)进行编码
② 使用URLDecoder.decode(String s,String enc)进行解码
Session中常用方法:
public String getId() | 获得session的ID |
---|---|
public Object getAttribute(String name) | 返回指定的对象信息 |
public void setAttribute(String name, Object value) | 使用指定的名称将对象绑定到此session,如果已将同名的对象绑定到session则替换该对象 |
public void removeAttribute(String name) | 删除session中指定名称绑定的对象 |
public void invalidate() | 使session失效 |
public boolean isNew() | 判断此session是否是新创建的 |
public long getCreationTime() | 获得session的创建时间 |
public long getLastAccessedTime() | 获得上次访问session的时间 |
HttpSession session = req.getSession() | 得到session |
实例代码:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解决中文乱码
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
// 得到Session
HttpSession session = req.getSession();
// 给session存信息
session.setAttribute("name","张三"); // value为Object对象
// 获取session的ID
String sessionId = session.getId();
// 判断session是不是新创建的
if (session.isNew()){
resp.getWriter().write("session创建成功,ID:"+sessionId);
}else {
resp.getWriter().write("session已经存在了,ID:"+sessionId);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
String name = (String) session.getAttribute("name");// 获取session中的信息
long creationTime = session.getCreationTime();// 获取session的创建时间戳
long lastAccessedTime = session.getLastAccessedTime();// 获取客户端上次的访问的时间
session.removeAttribute("name"); // 删除session中的信息
session.invalidate(); // 使session失效
在web.xml文件中配置session的失效时间:
<!-- 设置Session的失效时间 -->
<session-config>
<session-timeout>15</session-timeout> <!--以分钟为单位-->
</session-config>
使用场景:
①用户登录信息
②购物车信息
③整个网页中经常使用的信息