JavaWeb Cookie,Session

Cookie

1.Cookie翻译过来是饼干的意思。Cookie是服务器通知客户端保存键值对的一种技术。客户端有了Cookie 后,每次请求都发送给服务器。每个Cookie的大小不能超过4kb.

2.如何创建cookie,在客户端保存数据

cookie这个对象servlet的jar包给我们提供的,我们只需要去创建cookie,并且通知浏览器保存cookie就可以了!

/**
 * 创建cookie对象并且通知浏览器保存多个cookie
 *
 * @param req
 * @param resp
 */
public void addCookie(HttpServletRequest req, HttpServletResponse resp)
{
    //创建cookie对象
    Cookie cookie1 = new Cookie("username","Tom");

    //通知浏览器保存cookie
    resp.addCookie(cookie1);

    Cookie cookie2 = new Cookie("password","123456");
    //通知浏览器保存cookie
    resp.addCookie(cookie2);

    Cookie cookie3 = new Cookie("address","beijing");
    //通知浏览器保存cookie
    resp.addCookie(cookie3);

    Cookie cookie4 = new Cookie("idCard","987654");
    //通知浏览器保存cookie
    resp.addCookie(cookie4);
}

3.cookie的生命周期

cookie默认的生命周期是一个session级别的,浏览器的开启到关闭

4.获取客户端的cookie

/**
 * 获取客户端所有的cookie
 *      获取cookie没有提供获取单个cookie的方法,只有获取所有cookie,再筛选
 * @param req
 * @param resp
 */
public void getCookies(HttpServletRequest req, HttpServletResponse resp)
{
    //根据请求对象获取客户端的cookie
    Cookie[] cookies = req.getCookies();
    //遍历cookie数组
    //cookie.getName() 获取cookie的name
    //cookie.getValue()获取cookie的value
    for (Cookie cookie : cookies) {
        System.out.println(cookie.getName()+" "+cookie.getValue());
        try {
            resp.getWriter().print(cookie.getName()+" "+cookie.getValue());
            resp.getWriter().print("<br>");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

5.修改cookie的值

方案一:

  1. 先创建一个要修改的同名的Cookie对象
  2. 在构造器,同时赋于新的Cookie值
  3. 调用response.addCookie( Cookie )

方案二:

  1. 先查找到需要修改的Cookie对象
    2、调用setValue()方法赋于新的Cookie值。
    3、调用response.addCookie()通知客户端保存修改
/**
 * 修改cookie的值
 * @param req
 * @param resp
 */
public void setCookie(HttpServletRequest req, HttpServletResponse resp)
{
    //方法一:cookie 的 key不能重复,所以可以通过覆盖的方式
    //把username的值改为jack
    Cookie cookie = new Cookie("username", "jack");
    resp.addCookie(cookie);

    //方法2:
    Cookie c=null;
    Cookie[] cookies = req.getCookies();
    for (Cookie cookie1 : cookies) {
        if (cookie1.getName().equals("password"))
        {
            cookie1.setValue("456789");
            c=cookie1;
        }
    }
    resp.addCookie(c);
}

6.cookie在开发中的作用

  • cookie可以将数据保存在客户端,域对象request、servletContext是将数据保存在服务端。
  • cookie保存数据的大小不能超过4kb
  • 在开发登录模块的时候,通常会将用户名和密码的数据保存中cookie中(免密码登录、记住密码)
  • 开发购物车模块,我们会将购物车的商品信息保存在cookie中,用户将商品添加到购物车,没有必要将商品数据添加到数据库中,因为并不知道会不会付款,我们可以设置生命周期为一周,那么如果用户一周内不付款,则商品购物车的信息就将清空

EL表达式取出cookie中的数据:

取出cookie中的数据要注意其生命周期

<%--el表达式获取cookie中的数据--%>
${cookie.username.value}
${cookie.password.value}

栗子:

​ Cookie cookie = new Cookie("username","test");
​ resp.addCookie(cookie);
​ 创建一个cookie,名称是username,值是test的cookie对象,然后发送给服务端。
​ 然后在前台页面通过EL表达式获取cookie的值。

​ ${cookie.username.name} 得到"username"。

​ ${cookie.username.value}得到"test"。

Session

1、Session就一个接口(HttpSession)。
2、Session就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。
3、每个客户端都有自己的一个Session会话。
4、Session会话中,我们经常用来保存用户登录之后的信息

session是在服务端保存数据的一种技术,而且session可以关联客户端和服务端,session和cookie是有一定联系的。session也可以说是一个域对象,可以存取值,取值范围是浏览器的开启到关闭。以后会用session来保存用户登录之后的用户信息,之前所完成的登录功能是不完整的,在前端校验会话中是否有用户数据,如果有的话,才能是登录成功!session是一个单例对象。

创建session会话

request.getSession() 第一次调用是:创建Session会话
. isNew(); 判断到底是不是刚创建出来的。
getld(); 得到 Session的会话id值

创建session对象需要用到request对象,HttpSession session=request.getSession();

session生命周期控制

public void setMaxInactivelnterval(int interval):

设置Session的超时时间,超过指定的时长,Session就会被销毁,值为正数的时候,设定Session的超时时长。负数表示永不超时

getMaxInactivelnterval(): 获取Session的超时时间
invalidate():让当前Session会话马上超时无效。

session默认超时时间是30分钟,可以用session.setMaxInactiveInterval();方法设置。同时还可以在web.xml中配置超时时间,但此时单位是分钟

<!--设置默认的超市时间-->
<session-config>
    <session-timeout>60</session-timeout>
</session-config>

让当前session直接失效的方法 session.invalidate(),而cookie可以设置超时时间为0来使其失效。这个主要可以运用到账户的注销。

public class SessionDemo extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        resp.setContentType("text/html;charset=utf-8");
        HttpSession session = req.getSession();
        HttpSession session2 = req.getSession();
        
        //往session域中存数据
        session.setAttribute("key1","value1");
        session.setAttribute("key2","value2");

        //设置超时时间
        //session.setMaxInactiveInterval(60*60*24);

        //让当前session直接失效的方法 cookie可以设置超时时间为0来使其失效
        //session.invalidate();

        resp.getWriter().print("Session是否是新创建出来的 "+session.isNew()+"<br>");

        resp.getWriter().print("Session的会话id值为 "+session.getId()+"<br>");
        resp.getWriter().print("Session对象是否是单例的 "+(session==session2)+"<br>");

        resp.getWriter().print("取出session域中的数据key1 "+(session.getAttribute("key1"))+"<br>");
        resp.getWriter().print("取出session域中的数据key1 "+(session.getAttribute("key1"))+"<br>");
        //不设置超时时间的情况下直接去获取超时时间就是默认的超时时间
        resp.getWriter().print("session默认超时时间为(s): "+(session.getMaxInactiveInterval())+"<br>");


    }
}

Session和Cookie的联系与区别

关系:

cookie保存数据的原理就是通过http协议响应头的方式把数据传递过去

在浏览器访问服务端的时候,假设我们并没有手动的去创建session对象,但是我们在响应头中发现:会有一个set-cookie:

JSESSIONID = 4A810828D9F1821CFFD231E9267BFF3B

JSESSIONID =session的会话id

所以要想获得会话id,就必须得有session对象。

因此,浏览器访问服务端的时候,如果我们创建了session对象,会自动生成会话id,然后在底层会自动通过创建cookie对象的方式将会话id保存下来。我们在cookie中会找到JSESSIONID 4A810828D9F1821CFFD231E9267BFF3B 的记录

区别:

  • cookie是客户端保存数据的技术:cookie只能存放一些基本的数据,json串,不能存放java对象。cookie相对来说是不安全的,因为数据存在浏览器的内存里,可以通过一些途径来获取到这些数据。
  • session是服务端保存数据的技术:可以存放的数据类型有很多,String、List、Map、Java对象。session相对来说是安全的,但是会占用服务器的资源,cookie是不会占用服务器的资源的
posted @ 2021-09-11 09:04  ins1mnia  阅读(48)  评论(0编辑  收藏  举报