JavaWeb(四)Session、Cookie

会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程称之为会话。

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份Session通过在服务器端记录信息确定用户身份

1. 保存会话的两种技术

    1.1 cookie 

         客户端技术

package com.zjb.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 CookieDemoServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //解决中文乱码        req.setCharacterEncoding("utf-8");        resp.setContentType("text/html");        resp.setCharacterEncoding("utf-8");        PrintWriter out = resp.getWriter();        //服务器端从客户端获取        Cookie[] cookies = req.getCookies();        //判断cookie是否存在        if(cookies!=null){            out.write("您上次访问的时间是:");            for (Cookie cookie : cookies) {                //获取cookie的名字                if(cookie.getName().equals("lastLoginTime")){                    //获取cookie的值                    String value = cookie.getValue();                    Date date = new Date(Long.parseLong(value));                    out.write(date.toLocaleString());                }            }        }else{            out.write("这是您第一次访问本站");        }        //服务器给客户端发送一个cookie        Cookie cookie = new Cookie("lastLoginTime", String.valueOf(System.currentTimeMillis()));        //设置cookie有效期为1天,单位: s        cookie.setMaxAge(24*60*60);        resp.addCookie(cookie);    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doGet(req, resp);    }}

 

  cookie:一般会保存在本地的用户目录下appdata;

  • 一个cookie只能保存一个信息
  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
  • cookie大小有限制4kb
  • 300个cookie是浏览器上限

  删除cookie

  •  不设置有效期,关闭浏览器,自动失效
  •  设置有效期时间为0,就相当于删除了cookie

保存中文

package com.zjb.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.net.URLDecoder;import java.net.URLEncoder;public class UnicodeCookieServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        req.setCharacterEncoding("utf-8");        resp.setContentType("text/html");        resp.setCharacterEncoding("utf-8");        PrintWriter out = resp.getWriter();        Cookie[] cookies = req.getCookies();        if(cookies!=null){            out.write("您上次访问的名字:");            for (Cookie cookie : cookies) {                if(cookie.getName().equals("username")){                    //进行utf-8解码                    String value = URLDecoder.decode(cookie.getValue(), "utf-8");                    out.write(value);                }            }        }else{            out.write("您是第一次访问");        }        //URLEncoder.encode("张三","utf-8") 进行中文编码        Cookie cookie = new Cookie("username", URLEncoder.encode("张三","utf-8"));        resp.addCookie(cookie);    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doGet(req, resp);    }}

   1.2 session

     什么是session

  • 服务器会给每一个用户(浏览器)创建一个Session对象
  • 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在
  • 用户登录之后,整个网站它都可以访问。例:保存用户信息,保存购物车信息       

  向session中存储信息

package com.zjb.session;import javax.servlet.ServletException;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class SessionDemo01Servlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //解决中文乱码        req.setCharacterEncoding("utf-8");        resp.setContentType("text/html");        resp.setCharacterEncoding("utf-8");        //获取session        HttpSession session = req.getSession();        session.setAttribute("name","小明");         //获取session的ID        String sessionId = session.getId();                if(session.isNew()){           resp.getWriter().write("session创建成功,ID:"+sessionId);        }else{           resp.getWriter().write("session已经在服务器中存在了,ID:"+sessionId);         }           }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doGet(req, resp);    }}

 从session获取信息

package com.zjb.session;import javax.servlet.ServletException;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*** 从session中获取值*/public class SessionDemo02Servlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {            //获取session        HttpSession session = req.getSession();        String name = (String)session.getAttribute("name");                System.out.println(name);           }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doGet(req, resp);    }}

  手动注销session

package com.zjb.session;import javax.servlet.ServletException;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class SessionDemo03Servlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {            //获取session        HttpSession session = req.getSession();        //删除session中信息        session.removeAttribute("name");        //手动注销session         session.invalidate();           }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doGet(req, resp);    }}

 在web.xml中设置自动注销

<!-- 自动注销session  设置session默认的失效时间 --><session-config>  <!-- 1分钟后自动失效 单位:分钟-->  <session-timeout>1</session-timeout></session-config>

   1.3、cookie和session的区别

  • cookie数据存放在客户的浏览器上,session数据放在服务器上.
  • cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。
  • 设置cookie时间可以使cookie过期。但是使用session-destory(),我们将会销毁会话。
  • session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie。
  • 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。(Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型)

   注意:

  • session很容易失效,用户体验很差;
  • 虽然cookie不安全,但是可以加密 ;
  • cookie也分为永久和暂时存在的;
  • 浏览器 有禁止cookie功能 ,但一般用户都不会设置;
  • 一定要设置失效时间,要不然浏览器关闭就消失了;

    两者最大的区别在于生存周期,一个是浏览器启动到浏览器关闭.(浏览器页面一关 ,session就消失了),一个是预先设置的生存周期,或永久的保存于本地的文件。(cookie)

  Session信息是存放在server端,但session id是存放在client cookie的

  Cookie是完全保持在客户端的

参考:https://www.cnblogs.com/l199616j/p/11195667.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值