cookie-session

1. Cookie

Cookie 可以用来记录多个请求之间的联系,保存服务器的状态

实现一个记住用户名的功能

1.1如何创建Cookie

Cookie c = new Cookie(“名字”, “值”); // 创建cookie
c.setMaxAge(整数); // 设置cookie的寿命,单位是秒,没有设置寿命的是会话cookie浏览器关闭就删除
c.setMaxAge(0); // 设置寿命为0,意味着删除此cookie
response.addCookie©; // 通过响应对象,把创建的cookie返回给浏览器

浏览器每次发送请求时,就会根据域名进行检查,把该域名下的所有cookie发给服务器
java代码

@WebServlet(urlPatterns = "/createCookie")
public class CreateCookie extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 获取表单中的name参数
        req.setCharacterEncoding("utf-8");
        String name = req.getParameter("name");


        // 2. 进行编码
        String value = URLEncoder.encode(name, "utf-8");
        System.out.println(value);
        // 3. 根据编码的结果创建cookie
        Cookie c = new Cookie("name", value);
        // 没有指定时间的cookie,称为会话cookie,浏览器关闭前就会删除这些会话cookie
        // cookie中存入中文,需要编码URLEncoder.encode

        //c.setMaxAge(3600); // 以秒为单位 3600=1小时

        // 4. 通过响应返回给浏览器
        resp.addCookie(c);
        resp.addCookie(new Cookie("test","汉字"));

        // 5. 提示
        resp.getWriter().print("<html><body>cookie created...</body></html>");
    }
}

jsp代码

<%--
  Created by IntelliJ IDEA.
  User: 10927
  Date: 2018/9/21
  Time: 0:25
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="/createCookie" method="post">
    <input type="text" name="name" value="<%=v%>">
    <input type="text" name="name" value="${cookie.name.value}"> <!-- 找到了名为'name'的cookie,并把cookie的value值填在文本框中-->
    <input type="submit" value="提交">
</form>
</body>
</html>

1.2 获取cookie

Cookie[] cookies = request.getCookies(); // 获取请求中所有的cookie

1.3 中文问题

URLEncoder.encode(中文, “utf-8”); // 将编码后的中文存入cookie的值
URLDecoder.decode(“编码后的内容”, “utf-8”); // 把编码后的内容进行解码

1.4 el表达式获取cookie值

el的语法:
${cookie.cookie的名称.value}

1.5 cookie的限制

浏览器每个域名下能够包含30~50个cookie
每个cookie的长度大约是4k左右

2.session 会话

session也是用来存储多次请求之间的状态信息,session是把这些信息存在服务器的内容当中

2.1 session创建

HttpSession session = request.getSession();
// 首次调用getSession方法就是创建session对象
// 后续再调用getSession方法是获取第一次创建好的session对象

存入内容
session.setAttribute(“变量名”, 任意信息);
获取内容
Obejct 信息 = session.getAttribute(“变量名”);
删除内容
Obejct 信息 = session.removeAttribute(“变量名”);
让session失效(会清空session中所有内容)
session.invalidate();
例`@WebServlet(urlPatterns = “/createSession”)
public class CreateSession extends HttpServlet {

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 1. 创建或获取session对象
    HttpSession session = req.getSession();

    // 2. 存入信息
    session.setAttribute("name", "张三");

    // 3. 提示
    resp.getWriter().println("<html><body>session created...</body></html>");
}

}
`

2.2 典型应用-用户登录

java代码

@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 获取请求参数
        req.setCharacterEncoding("utf-8");
        // Object 值 = req.getAttribute("名"); 从request作用域中根据名字获取值
        // String 值 = req.getParameter("名"); 从请求参数(表单或地址栏)获取值
        Object username = req.getParameter("username");
        String password = req.getParameter("password");

        // 2. 执行用户名密码验证
        if("zhangsan".equals(username) && "123".equals(password)) { // 正确
            // 3. 获取session对象
            HttpSession session = req.getSession();
            // 4. 存储登录标记
            session.setAttribute("isLogin", true);
            session.setAttribute("username", username);
            // 5. 跳转到欢迎页面
            req.getRequestDispatcher("welcome.jsp").forward(req,resp);
        } else { // 错误
            req.getRequestDispatcher("login.jsp").forward(req,resp); // 跳回登录页面
        }
    }
}

jsp代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="/login" method="post">
    <input type="text" name="username" placeholder="请输入用户名">
    <input type="password" name="password" placeholder="请输入密码">
    <input type="submit" value="登录">
</form>
</body>
</html>

2.3 典型应用-用户注销(安全退出)

清除信息

@WebServlet(urlPatterns = "/logout")
public class LogoutServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.invalidate(); // 让session失效(让内容全部清空)
        req.getRequestDispatcher("login.jsp").forward(req,resp);
    }
}

2.4 jsp页面获取session中的变量

${sessionScope.变量名}

2.5 session实现的原理

session 必须针对同一个浏览器,才能实现在请求存储信息,在之后的请求获取信息的效果

每个用户访问服务器时,服务器会为他们创建一个独立的session

  1. 首次创建session时,tomcat会产生一个名为JSESSIONID=session的唯一标识 的特殊cookie
    这个JSESSIONID=1就会随着响应返回给浏览器
  2. 浏览器会记录这个cookie。之后的所有请求会把此cookie发送给服务器。
    服务器根据cookie的值找到对应的session
  3. jsessionid 这个cookie属于会话cookie,浏览器关闭就会消失

对比session和cookie

  1. session是将信息存储于服务器端,cookie是将信息存储于浏览器端
  2. session与cookie相比,更为安全
  3. session的生命周期相对较短,
    两次请求间隔超过30分钟,服务器会销毁session
    调用session.invalidate方法时,会立刻销毁
    cookie
    会话cookie是浏览器关闭就销毁
    setMaxAge的cookie会根据设置的寿命存活一段时间
  4. 存储的信息量上
    cookie 每个最大大小是4k左右
    session 理论上没有限制,但session要占用服务器内存,所以不太适合存储太多的内容
    信息要永久存储,还是需要使用数据库
  5. cookie里数据都得是字符串,而session里可以存储任意类型
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值