Servlet学习2

7、Session、Cookie

7.1 会话

会话:用户打开一个浏览器,点击了连接,浏览了web资源,关闭浏览器,这个过程就称之为会话

有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话

一个网站,怎么证明你浏览过?(客户端)——》(服务端)

  1. 服务端给客户端一个信件(cookie),客户端下次访问服务端带上信件(cookie)就可以了,

  2. 服务端登记你来过了,下次你来的时候我来匹配你;(session)

7.2、保持会话的两种技术

cookie

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

session

  • 服务器技术(利用这个技术可以保存用户的会话信息,可以把信息或者数据放在session中)

应用场景:网站登录

7.3、cookie

  1. 从请求中获取cookie信息

  2. 服务器响应给客户端

    req.getCookies();    //获得cookie
    cookie.getName();   //获得名字
    cookie.getValue();  //获得内容
    Cookie("lastLoginTime",String.valueOf(System.currentTimeMillis())); //新建
    cookie.setMaxAge();  //设置cookie有效期
    resp.addCookie(cookie)   //响应给客户端一个cookie

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

    一个网站cookie是否存在上限?

    1. 一个cookie只能保存一个信息

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

    3. cookie大小有限制

    4. 浏览器上限大概为300个

    删除cookie:

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

    • 设置有效期时间为0(建议另一个同名cookie,设置有效期为0,并发送这个cookie,前面的cookie就被覆盖,达到关闭cookie的作用)

编码解码

Cookie cookie = new Cookie("name",URLEncoder.encond("刘正伟","utf-8"));   
pw.write(URLDecoder.decode(cookie.getValue(),"utf-8"));   

7.4、Session

session(会话):

  • 服务器会给每一个用户创建一个session对象

  • 一个Session独占一个浏览器

  • 用户登陆之后,可以访问该站点每一个页面

Session和cookie的区别:

  • cookie是把用户的数据写给用户的浏览器,浏览器保存

  • Session十八用户的信息写到用户独占Session中,服务器端保存,

  • Session对象由服务器创建

使用场景:

  • 保持一个登陆用户信息

  • 购物车信息

  • 在整个网站中经常会使用的数据,将他保存在Session中

SessionDemo1

package com.liu.cookiesession;
​
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
​
/**
 * @version 1.0
 * @description:TODO
 * @Author:
 * @date :2021/9/21 16:22
 */
public class SessionDemo1 extends HttpServlet {
​
​
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //得到Session
        HttpSession session = req.getSession();
        //给Session中放入数据
        session.setAttribute("person",new person1("刘正伟",22,1999,0));
        String id = session.getId();
        boolean aNew = session.isNew();
        PrintWriter pw = resp.getWriter();
        pw.write("sessionId is:"+id+"\nSession isNew is:"+aNew);
​
        //session.removeAttribute("name");  可以指定销毁session中的某个属性
        //session.invalidate();  手动注销一个session
​
​
    }
​
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
​
}
​
public class SessionDemo2 extends HttpServlet {
​
​
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //编码
        resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //得到Session
        HttpSession session = req.getSession();
        person1 name = (person1)session.getAttribute("person");
        System.out.println(name.toString());
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
​
}

手动注销

session.removeAttribute("name");  //可以指定销毁session中的某个属性
session.invalidate();           //手动注销一个session

自动注销

<!--    设置Session的有效时间-->
    <session-config>
        <session-timeout>1</session-timeout>  <!--设置超时时间,以分钟为单位-->
    </session-config>
上一篇:Servlet-解决response响应中文乱码


下一篇:三万字Javaweb教程