学习Cookie和Session之前我们先理解一下会话
1 会话
会话:打开一个浏览器,访问网页,然后关闭浏览器,这个过程叫一次会话。
有状态会话:你用浏览器访问了一个网站,网站知道了你曾经访问过,这就是有状态会话,
那么问题来了,网站怎么知道你来过呢?
我们来举个生活中签到的例子:
你去公司签到,怎么证明你今天到了
- 1 公司给你个签到条,上面写着日期名字
- 2 你刷卡,公司把你今天刷卡记录保存下来
两种方式第一个是你保存了凭据,第二种是公司保存了凭据,
根据上面的例子,我们来类比一下,
你就是浏览器,公司是服务器;
Cookie是第一种方式,Session是第二种方式。
(显而易见,刷卡方式(Session)比较好一些,Cookie方式Low一些,我们重点掌握Session,理解Cookie)
2 Cookie
理解一下Cookies对象是以数组形式存储的,是一个Cookie组成一个数组;
常用的Cookie方法:
- 获取Cookies
- 创建Cookie
- 添加Cookie到Cookie
如何获取Cookies:
Cookie[] cookies = req.getCookies();
如何创建Cookie
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
如何添加
resp.addCookie(cookie);
接下来我们做一组Demo,用Cookie记录一下上次访问时间,打印到页面上
public class TestCookie1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
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("lastLoginTime")){
long lastLoginTime = Long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
out.write(date.toGMTString());
}
}
}else {
System.out.println("first visit");
}
//给lastLoginTime赋值
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
resp.addCookie(cookie);
}
}
<servlet>
<servlet-name>c1</servlet-name>
<servlet-class>com.duowei.servlet.TestCookie1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>c1</servlet-name>
<url-pattern>/c1</url-pattern>
</servlet-mapping>
我们访问C1,第一访问没有打印出 lastLoginTime ,第二次访问时候访问可以看到Cookie里的lastLoginTime。
3 Session
Session的用法跟Cookie的相似
- 获取Session
- 获取SessionID
- 判断Session是不是新的
- 给Session设置键值对
public class TestSession1 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.setAttribute("name", "weiduo");
//获取SessionID
String sessionId = session.getId();
//判断Session是不是新的
if (session.isNew()) {
resp.getWriter().write("成功创建session,sessionId==" + sessionId);
} else {
resp.getWriter().write("session已经存在");
}
String name = (String) session.getAttribute("name");
System.out.println(name);
}
}
<servlet>
<servlet-name>s1</servlet-name>
<servlet-class>com.duowei.servlet.TestSession1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>s1</servlet-name>
<url-pattern>/s1</url-pattern>
</servlet-mapping>
我们观察一下Session ID 存到了Cookie里了
可以理解为你要获得仓库里的东西,不用把仓库搬到你家里,而是把仓库钥匙带上就可以了。
下面的Session方法可以自己跑一下demo
移除Session属性
session.removeAttribute("name");
还没有完,Session如何失效呢?有两种模式,
- 手动失效
- 失效时间到期
session.invalidate();
在web.xml里面设置
<!--设置Session默认的失效时间-->
<session-config>
<!--15分钟后Session自动失效,以分钟为单位-->
<session-timeout>1</session-timeout>
</session-config>
最后说完了Cookie和Session,我们知道了会话技术可以获取用户自己的数据,如
- 保存用户名密码信息
- 购物车
- 收藏夹等等
但是如何获取用户之间的共享数据呢?比如网站的访问人数
那么可以用到ServletContext,想了解可以看一下我之前写的博客