十、Cookie和Session

十四、Cookie和Session

1、Cookie饼干

1.1、什么是Cookie?

1、内容

1、Cookie翻译是意思是饼干

2、Cookie 是服务器通知客户端保存键值对的一种技术

3、客户端有了Cookie后,每次请求都会发送服务器。

4、每个Cookie的大小不能超过4kb

1.2、如何创建Cookie

1、图解

image-20230428153321649

2、例子

    protected void  creatCookie(HttpServletRequest req ,HttpServletResponse resp) throws IOException {
//        创建cookie对象
        Cookie cookie = new Cookie("key1","value1");
//        通知客户端保存数据
        resp.addCookie(cookie);
        Cookie cookie2 = new Cookie("key2","value2");
//        通知客户端保存数据
        resp.addCookie(cookie2);

        resp.getWriter().write("cookie创建成功");

    }

1.3、服务器如何获取Cookie值

1、图解

image-20230428153708303

2、代码

1、Cookie工具类代码

public class CookieUtils {
    public static Cookie findCookie(String  name, Cookie[] cookies){
        if(name==null || cookies==null || cookies.length==0){
            return null;
        }
        for (Cookie cookie:cookies){
            if(name.equals(cookie.getName())){
                return cookie;
            }
        }
        return null;
    }
}

2、例子代码

    protected void  getCookie(HttpServletRequest req ,HttpServletResponse resp) throws IOException {
        Cookie [] cookies = req.getCookies();
        for (Cookie cookie :cookies){
//            查询指定的cookie
            Cookie iwantCookie = CookieUtils.findCookie("key1",cookies);

//            getName返回cookie中的key
//            getValue返回cookie中的value
            resp.getWriter().write("cookie:"+cookie.getName()+"==="+cookie.getValue()+"<br/>");

            if(iwantCookie!=null){
                resp.getWriter().write("找到了需要的Cookie:"+iwantCookie.getName());
            }
        }
    }

1.4、Cookie值的修改

1、方法一

1、创建一个要修改的同名(key)的cookie对象

2、在构造器中,同时赋予新的Cookie值

3、调用response.addCookie(Cookie);

4、例子

    protected void  updateCookie(HttpServletRequest req ,HttpServletResponse resp) throws IOException {
//        方法一:
//        创建一个要修改的同名cookie对象
//        在构造器,同时赋予新的cookie值
        Cookie cookie = new Cookie("key1","newValue1");
//        调用response.addCookie
        resp.addCookie(cookie);
        }

2、方法二

1、查找到需要修改的Cookie对象

2、调用setValue()方法赋予新的Cookie值

3、调用response.addCookie()通知客户端保存修改

4、例子

    protected void  updateCookie(HttpServletRequest req ,HttpServletResponse resp) throws IOException {

//        方法二:
//        查询需要修改的cookie对象
        Cookie cookie = CookieUtils.findCookie("key1",req.getCookies());
        if(cookie!=null){
//            调用setValue()方法赋予新的Cookie值
            cookie.setValue("newValue2");
//            调用response.addCookie()通知客户端保存
            resp.addCookie(cookie);

        }
    }

1.5、浏览器如何查看Cookie

1、谷歌例子

image-20230428154239549

2、火狐例子

image-20230428154247829

1.6、Cookie生命控制

1、什么是生命控制

1、Cookie的生命控制:如何管理Cookie什么时候被销毁(删除)

2、方法:setMaxAge()

1、setMaxAge()方法:设置生命周期

(1)当里面参数为正数:表示指定秒后过期

(2)当参数为负数:表示浏览器关闭,Cookie就会被删除(默认为-1)

(3)当参数为0时:表示马上删除Cookie

3、例子:设置存货运行时的Cookie

protected void  life3600(HttpServletRequest req ,HttpServletResponse resp) throws IOException {
    Cookie cookie = new Cookie("life3600","life3600");
    cookie.setMaxAge(60*60);//设置Cookie一个小时后被删除,无效
    resp.addCookie(cookie);
    resp.getWriter().write("已结创建了存活一小时的cookie");
}

4、例子:立马删除Cookie

    protected void  deleteNow(HttpServletRequest req ,HttpServletResponse resp) throws IOException {
//        找到需要删除的cookie对象
        Cookie cookie = CookieUtils.findCookie("key2",req.getCookies());

        if(cookie!=null){

//        调用setMaxAge(0)
            cookie.setMaxAge(0);
//            调用response.addCookie()通知客户端保存
            resp.addCookie(cookie);

            resp.getWriter().write("key2已结被删除了");

        }

    }

1.7、Cookie有效路径的path设置

1、内容

1、Cookie的path属性可以有效的过滤哪些Cookie可以发送给服务器。

2、path属性是通过请求的地址进行有效的过滤

3、例子

image-20230428154823981

2、例子

    protected void  testPath(HttpServletRequest req ,HttpServletResponse resp) throws IOException {
        Cookie cookie = new Cookie("path1","path1");
//        getContextPath()得到工程路径
        cookie.setPath(req.getContextPath()+"/abc");
        resp.addCookie(cookie);
        resp.getWriter().write("创建了一个带有工程路径的cookie");
    }

1.8、Cookie练习:免输入用户名登录

1、图解

image-20230428154932955

2、代码实现

1、login.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="http://localhost:8080/13_cookie_session/loginServlet" method="get">
        用户名:<input type="text" name="username" value="${cookie.username.value}"><br/>
        密码:<input type="password" name="password"><br/>
        <input type="submit" name="sub" value="点击登录">
    </form>

</body>
</html>

2、LoginServlet.java

public class LoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username =req.getParameter("username");
        String password = req.getParameter("password");
        if("123456".equals(username) &&"123456".equals(password)) {
//            成功
            Cookie cookie = new Cookie("username" ,username);
            cookie.setMaxAge(60*60*24);
            resp.addCookie(cookie);
            System.out.println("登录成功");
        }else {
//            失败
            System.out.println("登录失败");
        }

    }
}

2、Session会话

2.1、什么是Session会话

1、内容

1、Session是一个接口(HTTPSession)

2、Session就是一个会话,它是用来维护一个客户端和服务器之间关联的技术

3、每个客户端都有自己的一个Session会话。

4、Session会话中,我们经常用来保存用户登录之后的信息。

2.2、创建Session和获取(id号,是否更新)

1、创建和获取的API都是一样的

1、创建Session和获取

1、request.getSession()

(1)第一次调用:创建Session会话

(2)之后调用都是:获取前面创建好的Session会话对象

2、获取id号

1、通过session.getId()方法,可以获取唯一的id

2、每个会话都有一个id值,这个id是唯一的

3、判断session是获取还是判断

1、isNew():方法判断session是不是新创建的

(1)true:是

(2)false:不是

(3)返回值是:boolean

4、例子

    protected void creatOrGetSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        创建session对象
        HttpSession session = req.getSession();
//        判断是不是第一次创建
        boolean isNew = session.isNew();
//        获取session会话的唯一id
        String  id = session.getId();

        resp.getWriter().write("得到session,她的id为:"+id);
        resp.getWriter().write("得到的session是不是第一次创建:"+isNew);
    }

2.3、Session域数据的存取

1、取出Session域中的数据

1、通过req.getSession().getAttribute():方法获取

2、设置Session域中的数据

1、通过req.getSession().setAttribute():方法获取

3、例子

/**
 * 往session设置数据
 * @param req
 * @param resp
 * @throws ServletException
 * @throws IOException
 */
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.getSession().setAttribute("key1","value1");
    resp.getWriter().write("已经在Session保存了数据");
}

/**
 * 往session得到数据
 * @param req
 * @param resp
 * @throws ServletException
 * @throws IOException
 */
protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    Object attribute = req.getSession().getAttribute("key1");
    resp.getWriter().write("获取的数据为:"+attribute);
}

2.4、Session生命周期控制

1、内容

1、public void setMaxInactiveInterval(int interval):设置 Session 的超时时间(以秒为单位)

2、超过指定的时长,Session 就会被销毁。

3、设置的值interval为正数:设定的时长到达后超时

4、设置的值interval为负数:永不超时

5、Session的默认超时时长为30分钟

2、超时的概念

image-20230428160606922

3、修改tomcat中Session的默认超时

1、在tomcat服务器配置文件中的web.xml默认有以下配置进行修改

2、

​ \

​ \30\

​ \

4、修改个人的web工程中Session的默认超时

1、在个人的web工程下的web.xml配置中修改

​ \

​ \30\

​ \

5、修改个别的Session超时时长

1、使用API中的public void setMaxInactiveInterval(int interval)方法来进行设置

2、例子

protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    HttpSession session =req.getSession();
    session.setMaxInactiveInterval(3);
    resp.getWriter().write("默认时长为:3秒后超时");

}

2.5、浏览器和Session之间关联的技术内幕

1、内容

1、Session技术,底层其实是基于Cookie技术来实现的

2、图解

image-20230428160910511

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇