码迷,mamicode.com
首页 > 其他好文 > 详细

cookie和session

时间:2021-04-19 15:25:44      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:extends   时间   equal   add   map   character   mil   exce   get   

会话

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

一个网站怎么证明你来过

客户端 服务端

  1. 服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了; cookie
  2. 服务器登记你来过了,下次你来的时候我来匹配你; session

客户端技术(响应,请求)

public class CookieDemo01 extends HttpServlet {
    
    @Override
    protected void deGet(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) {
            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
        Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
        
        cookie.setMaxAge(24*60*60); //cookie有效期为一天
        
        resp.addCookie(cookie);
        
    }
    
    @Override
    protected void dePost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
    
}
<servlet>
    <servlet-name>CookieDemo01</servlet-name>
    <servlet-class>com.meng.servlet.CookieDemo01</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>CookieDemo01</servlet-name>
    <url-pattern>/c1</url-pattern>
</servlet-mapping>
  1. 从请求中拿到cookie信息
  2. 服务器响应给客户端cookie
Cookie[] cookies = req.getCookies(); //获得Cookie
cookie.getName(); //获得cookie中的key
cookie.getValue(); //获得cookie中的value
new Cookie("lastLoginTime",System.currentTimeMillis()+"");//新建一个Cookie
cookie.setMaxAge(24*60*60); //设置cookie的有效期
resp.addCookie(cookie); //响应给客户端一个cookie

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

  • 一个Cookie只能保存一个信息

  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie

  • Cookie大小有限制4kb

  • 300个cookie浏览器上限

删除Cookie:

  • 不设置有效期,关闭浏览器,自动失效
  • 设置有效期时间为0

解决中文乱码问题

Cookie cookie = new Cookie("name",URLEncoder.encode("秦疆","utf-8"));
out.write(URLDecoder.decode(cookie.getValue(),"UTF-8"));

技术图片

Session(重点)

服务端技术,利用这个技术,可以保存用户的会话信息?我们可以把信息或者数据放在Session中

什么是Session?

  • 服务器会给每一个用户(浏览器)创建一个Session对象
  • 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在
  • 用户登录之后,整个网站都可以访问-->保存用户的信息;保存购物车的信息
public class SessionDemo01 extends HttpServlet {
    
    @Override
    protected void deGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        //解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        
        //得到Session
        HttpSession session = req.getSession();
        
        //给Session中存东西
        session.setAttribute("name","秦疆");
        
        //获取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);
        
    }
    
    @Override
    protected void dePost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
    
}
public class SessionDemo02 extends HttpServlet {
    
    @Override
    protected void deGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        //解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        
        //得到Session
        HttpSession session = req.getSession();
        
        String name = (String)session.getAttribute("name");
        System.out.println(name);
        
    }
    
    @Override
    protected void dePost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
    
}
//得到Session
HttpSession session = req.getSession();

Person person = (Person) session.getAttribute("name");

System.out.println(person.toString());

HttpSession session = req.getSession();
session.removeAttribute("name");
//手动注销Session
session.invalidate();

会话自动过期:web.xml配置

<!--设置Session默认的失效时间-->
<session-config>
    <!--15分钟后Session自动失效,以分钟为单位-->
    <session-timeout>15</session-timeout>
</session-config>

Session和cookie的区别

  • Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
  • Session把用户的数据写到用户独占Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
  • Session对象由服务器创建

Session使用场景:

  • 保存一个登录用户的信息
  • 购物车信息
  • 在整个网站中经常会使用的数据

技术图片

cookie和session

标签:extends   时间   equal   add   map   character   mil   exce   get   

原文地址:https://www.cnblogs.com/oucmly/p/14669441.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!