一.会话
会话:用户打开了一个浏览器,点击了很多超链接,访问了多个web资源,关闭浏览器,这个过程可以称之为会话。
有状态会话:
你怎么证明你是重工的学生?
你 重工
1.发票 重工给你缴费的发票
2.学校的点名册 重工标记了你来过学校
同理:一个网站怎么证明你来过了?
客户端 服务端
1.服务端给客户端一个信件,客户端下次访问服务端带上信件即可:(cookie)
2.服务器登记你来过了,下次来的时候继续匹配你:(seesion)
二.保存会话的两种技术
cookie: 客户端技术(响应,请求)
seesion:服务器技术,利用这个技术,可以保存用户的会话信息,可以把数据保存在session中
常见引用:
访问网站时,第一次访问时登录以后,下次再来访问就可以不用登录了
三.Cookie
1.从请求中拿到cookie信息
2.服务器响应给客户端Cookie
//保存用户上一次访问的时间 public class CookieDome01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //服务器会记录你来的时间,把这个时间封装成为一个信件,下次访问的时候,就可以知道你上次多久来的 //解决中文乱码 req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); PrintWriter out = resp.getWriter();//输出对象,用于输出一些文字的 //cookie 服务器从客户端获取 Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie可能存在多个 //判断cookie 是否纯在 if(cookies!=null){ //如果存在,就输出上次访问的时间 for (int i = 0; i <cookies.length ; i++) { Cookie cookie = cookies[i]; //获取cookies的名字 if(cookie.getName().equals("lastLoginTime")){ //获取cookies的值 out.write("您上一次访问的时间是:"); long lastLoginTime = Long.parseLong(cookie.getValue());//这一步才是获得时间的方法 Date date = new Date(lastLoginTime); out.write(date.toLocaleString()); } } }else{ out.write("这是您第一次访问!"); } //当用户第一次访问时候给用户发一个cookie Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+""); cookie.setMaxAge(24*60*60);//设置cookies有效期为1天 resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
我们在使用cookie中所用到的方法
1. Cookie[] cookies = req.getCookies();//获得cookie
2. cookie.getName() 获得cookie 中key(名字) equals:判断两个对象的值是否相等
3. cookie.getValue() 获得cookie中的vlaue
4. Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");用户是第一次访问的时候这个申请的cookie是服务器发给客户端的
5. cookie.setMaxAge(24*60*60); 设置cookie的有效期
6. resp.addCookie(cookie); 响应客户端的cookie ,因为cookie每次都在变化,所以不管是第一次还是多次访问以后,都需要一个新的cookie
补充:
cookies:一般会保存在本地的目录下 在用户目录下的 appdata
一个网站的cookie是否存在上线?
a.一个cookie只能保存一个信息
b.一个web服务器可以向浏览器发送多个cookie,最多放置20个cookie
c. cookie大小有限制:4KB
d. 浏览器最多可以接收300个cookie
删除cookies
a.不设置有效期,关闭浏览器,自动消失
b.设置cookie的有效期为 0
解决servlet中文乱码问题
resp.setHeader("content-type","text/html;charset=UTF-8");
URLEncoder.encode("马明","utf-8")//编码
URLDecoder.decode(cookie.getValue(),"utf-8")//解码
Session(重点)
服务器会给每个用户(浏览器)创建一个session对象
一个session独占一个浏览器,只要浏览器没有关闭,这个session就一直存在
用户登录之后,整个网站拓展都可以访问=====保存用户信息,保存购物车信息
session和cookie的区别
cookie是把用户的数据写给用户浏览器,浏览器保存(可以保存多个)
session把用户的数据写到用户独占的session中,服务器端保存(保存重要信息,减少资源浪费)
session对象由服务器创建
常见应用
保存用户的登录信息
购物车信息
整个网站中经常会使用的数据,保存在网站中
public class SessionDemo01 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;charest=utf-8"); //得到session HttpSession session = req.getSession(); //给session存东西 session.setAttribute("name",new presion("马明",19)); //获得session的id String id = session.getId(); //判断按session是不是创建成功 if(session.isNew()){ resp.getWriter().write("session创建成功,ID:"+id); }else{ resp.getWriter().write("session已经在服务器中存在了,ID:"+id); } //session创建的时候做了什么事情 //实际上session就是创建的一个cookie,然后带回了浏览器 /*Cookie cookie = new Cookie("name", id); resp.addCookie(cookie);*/ } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
session的创建步骤和cookie的差不多,只是使用的方法一个是属于cookie方法,一个是session方法
a.得到session对象 HttpSession session = req.getSession();
b.给session中存入东西 session.setAttribute()
c.获得session的id String id = session.getId();
d.判断session是否创建成功 session.isNew() 返回的是布尔值(T or F)
e. session.getAttribute()拿到session的属性:可能是字符串,也可能是对象
f. session.removeAttribute("name");
session.invalidate();
手动注销session
会话自动过期:web.xml中配置
<session-config> <!--session自动过期,以分钟为单位--> <session-timeout>15</session-timeout> </session-config>