Cookie和Session
会话
(1)什么是会话
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话;
有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话;
(2)保存会话得两种技术
1.cookie 客户端技术
服务端给客户端一个 信件,客户端下次访问服务端带上信件就可以了;
2.session 服务端技术,利用这个技术,可以保存用户的会话信息? 我们可以把信息或者数据放在Session中!
服务器登记你来过了,下次你来的时候我来匹配你;
Cookie
(1)概念
Cookie 是存储在客户机的文本文件,它们保存了大量轨迹信息。在 Servlet 技术基础上,JSP 显然能够提供对 HTTP cookie 的支持。
(2)步骤
- 服务器脚本发送一系列 cookie 至浏览器。比如名字,年龄,ID 号码等等。
- 浏览器在本地机中存储这些信息,以备不时之需。
- 当下一次浏览器发送任何请求至服务器时,它会同时将这些 cookie 信息发送给服务器,然后服务器使用这些信息来识别用户或者干些其它事情。
(3)方法举例
1 public void setDomain(String pattern)
//设置 cookie 的域名,比如 runoob.com
2 public String getDomain()
//获取 cookie 的域名,比如 runoob.com
3 public void setMaxAge(int expiry)
//设置 cookie 有效期,以秒为单位,默认有效期为当前session的存活时间
4 public int getMaxAge()
//获取 cookie 有效期,以秒为单位,默认为-1 ,表明cookie会活到浏览器关闭为止
5 public String getName()
//返回 cookie 的名称,名称创建后将不能被修改
6 public void setValue(String newValue)
//设置 cookie 的值
7 public String getValue()
//获取cookie的值
8 public void setPath(String uri)
//设置 cookie 的路径,默认为当前页面目录下的所有 URL,还有此目录下的所有子目录
9 public String getPath()
//获取 cookie 的路径
10 public void setSecure(boolean flag)
//指明 cookie 是否要加密传输
11 public void setComment(String purpose)
//设置注释描述 cookie 的目的。当浏览器将 cookie 展现给用户时,注释将会变得非常有用
12 public String getComment()
//返回描述 cookie 目的的注释,若没有则返回 null
(4)使用JSP设置Cookie
使用 JSP 设置 cookie 包含三个步骤:
1.创建一个 cookie 对象
Cookie cookie = new Cookie("key","value");
2.设置有效期
//调用 setMaxAge() 函数表明 cookie 在多长时间(以秒为单位)内有效。下面的操作将有效期设为了 24 小时。
cookie.setMaxAge(60*60*24);
3.将 cookie 发送至 HTTP 响应头中
//调用 response.addCookie() 函数来向 HTTP 响应头中添加 cookie。
response.addCookie(cookie);
(5)如何删除Cookie
1.不设置有效期,关闭浏览器自动失效
2.设置有效时间为0
Session
(1)概念
- 服务器会给每一个用户(浏览器)创建一个Seesion对象;
- 一个Seesion独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
- 用户登录之后,整个网站它都可以访问!–> 保存用户的信息;保存购物车的信息……
- JSP利用servlet提供的HttpSession接口来识别一个用户,存储这个用户的所有访问信息。
(2)Cookie和Session的区别 - Cookie是把用户的数据写给用户的浏览器,浏览器保存 (可以保存多个)
- Session把用户的数据写到用户独占Session中,服务器端保存 (保存重要的信息,减少服务器资源的浪费)
- Session对象由服务创建;
(3)Session的方法
1 public Object getAttribute(String name)
//返回session对象中与指定名称绑定的对象,如果不存在则返回null
2 public Enumeration getAttributeNames()
//返回session对象中所有的对象名称
3 public long getCreationTime()
//返回session对象被创建的时间, 以毫秒为单位,从1970年1月1号凌晨开始算起
4 public String getId()
//返回session对象的ID
5 public long getLastAccessedTime()
//返回客户端最后访问的时间,以毫秒为单位,从1970年1月1号凌晨开始算起
6 public int getMaxInactiveInterval()
//返回最大时间间隔,以秒为单位,servlet 容器将会在这段时间内保持会话打开
7 public void invalidate()
//将session无效化,解绑任何与该session绑定的对象
8 public boolean isNew()
//返回是否为一个新的客户端,或者客户端是否拒绝加入session
9 public void removeAttribute(String name)
//移除session中指定名称的对象
10 public void setAttribute(String name, Object value)
//使用指定的名称和值来产生一个对象并绑定到session中
11 public void setMaxInactiveInterval(int interval)
//用来指定时间,以秒为单位,servlet容器将会在这段时间内保持会话有效
(4)举例
public class SessionDemo1 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("name","zhangsan");
//获取session的ID
String id = session.getId();
//判断Session是不是新创建
if(session.isNew()){
resp.getWriter().write("session创建成功");
}else {
resp.getWriter().write("session创建失败");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}