Session(会话)
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话。
有状态会话:一个学生来过教室,下次再来教室,我们会知道这个同学,曽经来过,称之为有状态的会话。
一个网站怎么证明你来过?
客户端 服务端
- 服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了; cookie
- 服务器登记你来过了,下次你来的时候我来匹配你; seesion
保存会话的两种技术
cookie
- 客户端技术 (响应,请求)
session
- 服务器技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或数据放在Session中
常见场景:网站登录之后,你下次不用再登录了,第二次访问直接就登录了
Cookie
- 从请求中拿到cookie信息
- 服务器响应给客户端cookie
cookie常用的方法:
Cookie[] cookies = req.getCookies(); //获得cookie cookie.getName(); //获得cookie中的key cookie.getValue(); //获得cookie中的vlaue new Cookie("lastLoginTime", System.currentTimeMillis()+""); //新建一个cookie cookie.setMaxAge(24*60*60); //设置cookie有效期为24小时 resp.addCookie(cookie);//将cookie 响应回客户端
cookie 常用方法的使用:
package com.xu.cookie; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; public class CookieDemo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //服务器告诉你,你来的时间,把这个时间封装成为也给信件 , 你下次带来,我就知道你来了 //先解决中文乱码问题 req.setCharacterEncoding("utf-8"); // 如果写 resp.setCharacterEncoding("utf-8");还是显示乱码,就将resp 代码改为:resp.setContentType("text/html;charset=utf-8"); resp.setContentType("text/html;charset=utf-8"); //创建一个输出流对象 PrintWriter out = resp.getWriter(); //Cookie,是服务端从客户端获取的 Cookie[] cookies = req.getCookies();//这里是返回数组,说明Cookie可能存在多个 //判断Cookie 是否存在 if(cookies!= null){ //判断Cookie 不为空, 则不是第一次访问 //cookie 存在 out.write("你上次访问的时间是:"); for (int i = 0; i < cookies.length; i++) { Cookie cookie = cookies[i]; //获取cookie 的名字 if (cookie.getName().equals("lastLoginTime")){ //获取cookie 中的值 long lastLoginTime = Long.parseLong(cookie.getValue()); Date date = new Date(lastLoginTime); out.write(date.toLocaleString()); } } }else { out.write("这是您第一次访问本站"); } //服务端给客户端响应(发送)一个cookie //先new一个cookie ,name为:lastLoginTime ;value为:最后一次访问的时间戳 Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+""); //设置cookie有效期为一天 cookie.setMaxAge(24*60*60); resp.addCookie(cookie);//将cookie 响应回客户端 } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
web.xml 文件配置servlet :
<servlet> <servlet-name>CookieDemo01</servlet-name> <servlet-class>com.xu.cookie.CookieDemo01</servlet-class> </servlet> <servlet-mapping> <servlet-name>CookieDemo01</servlet-name> <url-pattern>/c1</url-pattern> </servlet-mapping>
运行结果:
cookie:一般会保存到本地的 用户目录下 appdata
一个网站cookie 是否存在上限!
- 一个Cookie只能保存一个信息;
- 一个web站点可以给浏览器发送多个cookie,
- cookie大小限制:4kb
- 浏览器的上限:300个cookie
删除Cookie:
- 不设置有效期,关闭浏览器,自动失效;
- 设置有效期时间为 0 ;
删除Cookie代码实现:
package com.xu.cookie; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class CookieDemo02 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建一个cookie , 名字必须要和要删除的名字一致 Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + ""); //将cookie有效期设置为 0 ,立马过期 cookie.setMaxAge(0); //将cookie响应回客户端 resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
在web.xml 文件中配置servlet:
<!-- 配置CookieDemo02--> <servlet> <servlet-name>CookieDemo02</servlet-name> <servlet-class>com.xu.cookie.CookieDemo02</servlet-class> </servlet> <servlet-mapping> <servlet-name>CookieDemo02</servlet-name> <url-pattern>/c2</url-pattern> </servlet-mapping>
运行结果:
解决中文乱码问题:
//编码中文 URLEncoder.encode("小许","utf-8"); //解码中文 URLDecoder.decode(cookie.getValue(),"utf-8");