会话:用户打开一个浏览器,点了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话
有状态会话:一个客户端访问过服务端,下次再访问时,服务端会知道这个客户端访问过
一个网站,怎么证明客户访问过?(客户端->服务端)
保存会话的两种技术
cookie:一种客户端技术(请求和响应)
session:一种服务器技术,利用这个技术可以保存用户的会话信息,我们可以把信息和数据放在session中
常见实例:访问过一个网站,下一次不用再登录就可以直接访问
典例:保存用户的上一次访问时间
//保存用户上一次访问的时间
public class cookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//服务器告诉你来的时间,把那个时间封装成一个信件,你下一次带着信件来,服务器就知道你来了
req.setCharacterEncoding("utf-16");
resp.setCharacterEncoding("utf-16");
PrintWriter writer = resp.getWriter();
//Cookie是服务器从客户端获取的
Cookie[] cookies = req.getCookies(); //返回一个数组,说明cookie存在多个
//先判断Cookie是否存在
if(cookies!=null){
//如果存在
writer.write("你上一次访问的时间为:");
for(int i=0;i<cookies.length;i++){
Cookie cookie = cookies[i];
//获取cookie的名字
if(cookie.getName().equals("lastLoginTime")){
//获取cookie中的值
long l = Long.parseLong(cookie.getValue());
Date date = new Date(l);
writer.write(date.toLocaleString());
}
}
}else {
writer.write("这是你第一次访问本站");
}
//服务器给客户端响应一个cookie
resp.addCookie(new Cookie("lastLoginTime",System.currentTimeMillis()+""));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
启动测试
如果关闭浏览器,则上一次访问的时间将会改变,不再保存,但是可以通过设置有效期使上一次访问的时间在有效期内保存,即浏览器关闭cookie仍然存在
//cookie有效期为一天
cookie.setMaxAge(24*60*60);
cookie一般会保存在本地的用户目录下appdata
关于Cookie的删除:
注意:在通信时如果存在中文,最好使用这种方式:编码URLencoding.encode(“你好世界”,“utf-8”),解码URLDecoder.decode(“你好世界”,"utf-8’’)
Session简介:服务器会为每一个用户(浏览器)创建一个Session对象,一个Session独占一个浏览器,即只要浏览器没有关闭,这个Session就存在
用户登录之后,整个网站都可以访问–>保存用户信息(保存购物车等)
典例:通过session获取一个类的信息
访问/session存储信息
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("utf-16");
resp.setCharacterEncoding("utf-16");
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session = req.getSession();
//给session存储数据
session.setAttribute("name",new person("srq",520));
//获取session的id
String id = session.getId();
//判断是否是新的session
if(session.isNew()){
resp.getWriter().write("新的session已创建,新的session的id为:"+id);
}else {
resp.getWriter().write("session已经存在,新的session的id为:"+id);
}
//Session创建的时候做了什么事情
// Cookie cookie = new Cookie("JSESSIONID",id);
// resp.addCookie(cookie);
}
访问/s2打印信息
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("utf-16");
resp.setCharacterEncoding("utf-16");
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session = req.getSession();
//获取Session数据
person name = (person) session.getAttribute("name");
System.out.println(name.toString());
}
启动测试
Session的注销:
在java文件中注销
session.invalidate();
在配置文件中注销
<session-config>
//15min后session自动失效
<session-timeout>15session-timeout>
session-config>
Session与Cookie的区别:
Cookie:把用户的数据写给用户的浏览器(保存多个信息)
Session:把用户的数据写在用户独占的Session中(保存重要的信息),由服务器创建
使用场景:保存用户登录信息,保存购物车信息