1. Cookie、Session
1.1会话
会话:
用户打开一个浏览器,点击了好很多超链接,访问量多个web资源,挂壁浏览器,这个过程可以称之为会话。
有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话
一个网站,怎么证明你访问过?
客户端 服务端
- 服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了,cookie
- 服务端登记你来过了,下次你来的时候我来匹配你,session
1.2 保存会话的俩种技术
cookie
客户端技术(响应,请求)
session
服务器技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或者数据放在session中
1.3Cookie
-
从请求中拿到cookie的信息
-
服务器响应给客户端cookie
//Cookie服务端从客户端获取 Cookie[] cookies = req.getCookies(); cookie.getName()//获取cookie的key cookie.getValue()//获取cookie的value //服务器给客户端响应一个Cookie Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+""); //设置cookie的有效期,即使浏览器关闭后依然可以显示访问上次的时间,这个显示决定于设置的时间 cookie.setMaxAge(24*60*60); resp.addCookie(cookie);
案例:显示用户上次访问的时间
@Override
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是否存在
if (cookies!=null){
//如果存在
writer.write("您上次访问的时间为:");
for (int i = 0; i < cookies.length; i++) {
//获取cookie的值
Cookie cookie = cookies[i];
if (cookie.getName().equals("lastLoginTime")){
//获取cookie的值
long lastLoginTime = Long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
writer.write(date.toLocaleString());
}
}
}else {
writer.write("您是第一次访问此网站");
}
//服务器给客户端响应一个Cookie
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
//设置cookie的有效期,即使浏览器关闭后依然可以显示访问上次的时间,这个显示决定于设置的时间
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
}
注意:网络编程的时候传递的参数如果是中文不能被解析的话,是可以解码的
参数解码:URLEncoder.encode()
对应的解码:URLDecoder.decoder()
1.4 Session(重点)
session的常用方法
Session和Cookie的区别
- Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
- Session是把用户的数据写到用户独占的Session,服务器端保存(保存重要的信息,减少服务器端资源的浪费)
- Session对象由服务创建
使用场景
- 保存一个登录用户的信息
- 购物车信息
- 经常在网站中会使用的数据,我们可以将它保存在session中
使用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("person",new Person("谢益胜",19));
//获取Session的ID
String SessionID = session.getId();
//判断Session是不是新创建的
if(session.isNew()){
resp.getWriter().write("session创建成功,ID:"+SessionID);
}else {
resp.getWriter().write("session已经在服务器中存在了,ID:"+SessionID);
}
//Session在创建的时候做了什么事情
// Cookie cookie = new Cookie("JSESSIONID",SessionID);
// //响应给浏览器
// resp.addCookie(cookie);
}
在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取东西
Person person = (Person) session.getAttribute("person");
resp.getWriter().write("用户信息为:"+person);
}
手动移除session
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session对象
HttpSession session = req.getSession();
//移除person节点
session.removeAttribute("person");
session.invalidate();
}
在web.xml里面配置session的生存期限
<!--设置Session默认的失效时间-->
<session-config>
<!--15分钟后session自动失效,以分钟为单位-->
<session-timeout>15</session-timeout>
</session-config>
流程图
Cookie
Session
ServletContext