Java学习笔记(二十一):cookie、session

写在前面:

cookie
request.getCookies()      response.addCookie(cookie)
cookie.getName()   getValue()   setValue()   setMaxAge(s)
URLEncode.encode(str,"utf-8")     URLDecode.decode(str,"utf-8")
session
request.getSession()
session.setAttribute(名,值)     getAttribute(名)      removeAttribute(名)

 


1. 会话技术

浏览器第一次给服务器发送请求,会话建立,直到一方断开为止

一次会话包含多次请求和响应

功能:在一次会话的多次请求间共享数据

客户端会话技术:cookie(数据保存在浏览器)

服务端会话技术:session(数据保存在服务端HttpSession)

 

2. cookie

使用步骤

创建对象,绑定数据:new Cookie(名,值)

发送cookie:response.addCookie(cookie)

接受cookie:request.getCookies()   /   cookie.getName()   /  cookie.getValue()

实现原理

浏览器向A发送请求

A将cookie信息放到响应头中,给浏览器发出响应(set-cookie:名=值)

浏览器将cookie信息保存下来(名=值)

浏览器将cookie信息放到请求头中,向B发出请求(cookie:名=值)

 

一些细节问题

一次可以发送多个cookie(多创建几个cookie对象)

cookie在浏览器中保存时间:默认到浏览器关闭;可以手动设置cookie.setMaxAge(n)

--------n为正数:持久化,将cookie写到硬盘文件中,经过n秒后,文件消失

--------n为负数:默认值,到浏览器关闭

--------n为0:删除cookie信息

在tomcat8之后,cookie中可以保存中文,但是不支持特殊字符(比如空格)建议使用url编码解码

        URLEncoder.encode(str,"utf-8");//编码
        URLDecoder.decode(str,"utf-8");//解码

cookie名相同时,会覆盖

 

cookie共享问题:

一个tomcat下的多个项目:setPath(path)-----默认不共享,path设置为 /  可以共享(服务器的根目录)

同一个项目,在不同的tomcat下:setDomain(path)-----设置一级域名相同,则可以共享

特点

存在浏览器,不安全;一般存不敏感的数据

对单个cookie大小有限制(4kb左右);对同一域名下的cookie总量有限制(20个)

 

//案例:记住上一次访问时间

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");

        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();

        Date date=new Date();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr=sdf.format(date);
        dateStr= URLEncoder.encode(dateStr,"utf-8");//编码

        Cookie[] cookies = request.getCookies();
        boolean flag=false;
        String name="lastTime";

        if(cookies!=null && cookies.length>0){
            for(Cookie cookie:cookies){
                if(name.equals(cookie.getName())){
                    flag=true;

                    cookie.setValue(dateStr);
                    cookie.setMaxAge(60*60*24);
                    response.addCookie(cookie);

                    String lastTime=cookie.getValue();
                    lastTime= URLDecoder.decode(lastTime,"utf-8");//解码
                    writer.println("上次访问时间:"+lastTime);

                    break;
                }
            }
        }
        if(!flag){//这里注意:先设置cookie,再write输出
            Cookie cookie=new Cookie(name,dateStr);

            cookie.setMaxAge(60*60*24);
            response.addCookie(cookie);

            writer.println("首次访问");
        }
    }

 

3. session

session依赖于cookie

 

使用:

HttpSession session=request.getSession()

取值:getAttribute(名)

存值:setAttribute(名,值)

删除:removeAttribute(名)

原理:

服务器A第一次获取session,没有cookie时,会在内存中创建一个HttpSession对象

然后把这个session对象的id放入响应头中(set-cookie: jsessionid=xxx),给浏览器作出响应

浏览器会把这个cookie放到请求头中(cookie: jsessionid=xxx),给B发出请求

B会根据session的id,去内存中找有没有对应的session

 

细节:

浏览器关闭,服务端不关闭,两次获得的session不是同一个:因为会话结束了

-----设置成同一个的方法:创建一个jsessionid的cookie,并持久化

浏览器不关闭,服务器关闭,两次获得的session不是同一个:因为服务器关闭释放了内存

-----设置成同一个的方法:session钝化、活化;tomcat已自动完成两个过程

----------钝化:服务器正常关闭前,将session信息序列化到磁盘

----------活化:服务器启动之后,将session文件反序列化成内存中的session对象

-----idea无法完成两个过程,需要将项目打包放到tomcat下,由tomcat启动执行

----------因为idea重新启动时,会将work文件夹删掉重建,就把序列化的session文件删除了

特点:

任意类型;任意大小;存在服务器(安全)

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值