七、 Cookie和Session
7.1 Cookie
百度百科是这样描述cookie的
Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息 。
简单的说,cookie就是一个文件,存着用户和web会话的信息,存在客户端上。当然cookie也有很多自己的规则,例如不能超过4kb、内容为 name/value等等,总之,就是存储在客户端上的一个不超过4kb的小型文本数据,里面保存着用户和web会话的信息
我们可以在Java中拿到cookie对象,并且对它做一些事情,比如,我们可以做一个登录记录提醒,告诉用户上一次访问的时间。
直接上代码:
public class Test01_cookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 解决乱码问题
req.setCharacterEncoding("utf8");
resp.setCharacterEncoding("utf8");
resp.setContentType("text/html");
// 获取响应打印流,待会儿往页面上打印信息
PrintWriter out = resp.getWriter();
// 获取所有的cookie
Cookie[] cookies = req.getCookies();
// 判断有没有记录登录时间的cookie
boolean flag = false;
for (Cookie c : cookies) {
if (c.getName().equals("lastLoginTime")) {
flag = true;
break;
}
}
// 如果没有的话,说明是第一次访问,所以把记录登录时间的cookie加进去
if (!flag) {
out.println("这是您第一次访问");
Cookie cookie = new Cookie("lastLoginTime", String.valueOf(System.currentTimeMillis()));
// 设置存活时间,单位为秒
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
}
// 遍历cookie寻找记录登录时间的cookie
for (Cookie cookie : cookies) {
// 找到了就将其中的时间输出,然后将这次登录的时间加进去
if (cookie.getName().equals("lastLoginTime")) {
Date date = new Date(Long.parseLong(cookie.getValue()));
out.println("您的上一次登录时间是:" + date);
cookie.setValue(String.valueOf(System.currentTimeMillis()));
cookie.setMaxAge(24*60*60);
// 一定要加,不然不生效,我当时在这卡了好久
resp.addCookie(cookie);
break;
}
}
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
doGet(req, resp);
}
}
别忘了在web.xml中部署这个servlet,这就不赘述了。
7.2 Session
百度百科的解释:
Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在Session对象中。有关使用Session 对象的详细信息,请参阅“ASP应用程序”部分的“管理会话”。注意会话状态仅在支持cookie的浏览器中保留。
说的太学术了,session给我的感觉就像cookie,不过cookie存在客户端,而session存储在服务器上。
访问web的一瞬间,就会生成一个session,当浏览器第一次访问服务器时,服务器创建一个session对象(该 对象有一个唯一的id,一般称之为sessionId),服务器会将sessionId 以cookie的方式发送给浏览器。 当浏览器再次访问服务器时,会将sessionId发送过来,服务器依据 sessionId就可以找到对应的session对象,session超时会自动销毁,也可以手动销毁。
session中也能存储很多值,不仅可以存字符串,还可以存对象,话不多说,直接在代码中体会session:
// 获取session
public class Test02_session extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解决乱码问题
req.setCharacterEncoding("utf8");
resp.setCharacterEncoding("utf8");
resp.setContentType("text/html");
// 获取session
HttpSession session = req.getSession();
// 在session中存储信息,下一个测试用
session.setAttribute("username", "哦豁");
// 获得sessionid
String sessionId = session.getId();
// 判断session是否已经创建
if (session.isNew()) {
resp.getWriter().println("新的session");
} else {
resp.getWriter().println("已有session:" + sessionId);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
写完之后别忘了在web.xml中部署。
试试效果:
可以发现cookie中也有sessionid
session也有类似于ServletContext的效果,设置属性后,其他的servlet也可以访问:
public class Test03_session extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解决乱码问题
resp.setCharacterEncoding("utf8");
resp.setContentType("text/html");
// 获取sesion
HttpSession session = req.getSession();
// 获取username的值
String username = (String) session.getAttribute("username");
// 在控制台输出
System.out.println(username);
}
}
然后再web.xml中部署,不再赘述。
试试效果:
成功~
session的销毁
-
自动销毁
- 关闭浏览器自动销毁session
- 没有操作一段时间后session自动销毁,如再tomcat中,30分钟不进行操作,session就会自动销毁。
-
手动销毁
可以自己设定销毁时间
修改方式一:
修改web.xml文件
<session-config> <session-timeout>30</session-timeout> </session-config>
意为存活30分钟,如果值 <= 0那么意思就是session不自动销毁。
修改方式二:
调用HttpSession的Invalidate方法
public class Test04_session extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); // 销毁 session.invalidate(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
再说一遍,之后不再说
web.xml!!!
销毁session后,服务器会立马生成一个新的session。