博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
servlet中的cookie和session
阅读量:4099 次
发布时间:2019-05-25

本文共 2435 字,大约阅读时间需要 8 分钟。

http协议的特点:称之为无状态, 请求与请求之间不会记录状态(状态就包括请求参数等信息)

1. Cookie

本意是小甜点, 可以用来记录多个请求之间的联系,保存服务器的状态

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

1.1 创建Cookie

Cookie c = new Cookie("名字", "值"); // 创建cookie

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

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

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();

2.2 典型应用-用户登录

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

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里可以存储任意类型

3. 重定向请求

请求转发:

request.getRequestDispatcher("目录路径").forward(request,response);

请求重定向:

response.sendRedirect("目录路径");

区别:

1) 请求转发时,地址栏不会改变(是第一个servlet的地址)
重定向,地址栏会发生变化(是最后一个servlet的地址)
2) 请求转发时一次请求,跳转发生在服务器内部
重定向是两次请求,第一次请求会返回302的状态码和目标地址,
浏览器根据目标地址发送第二次请求,才完成整个流程
3) 重定向是两次请求,所以不能利用request作用域存值取值
但可以使用session作用域来存值取值
请求转发因为是同一次请求,所以可以使用request作用域存值取值
4) 请求转发的目标只能是本项目的servlet或jsp
重定向跳转的目标可以是任意的

查询

servlet --> jsp // 关系密切的跳转使用请求转发 forward()
删除
删除servlet --> 查询列表servlet // 关系不密切的跳转使用重定向 redirect()

select ... from ... limit n; // 每次最多查询n条记录

select ... from ... limit m, n; // 从m开始(m从0开始),每次最多查询n条记录

每页10条记录

1 页 limit 0, 10;
2 页 limit 10, 10;
3 页 limit 20, 10;
...
page(页号), size(每页记录数)

m=(page-1)*size

n=size

转载地址:http://vhksi.baihongyu.com/

你可能感兴趣的文章
Framework之View的工作原理(一)
查看>>
Web应用架构
查看>>
设计模式之策略模式
查看>>
深究Java中的RMI底层原理
查看>>
用idea创建一个maven web项目
查看>>
Kafka
查看>>
9.1 为我们的角色划分权限
查看>>
维吉尼亚之加解密及破解
查看>>
DES加解密
查看>>
TCP/IP协议三次握手与四次握手流程解析
查看>>
PHP 扩展开发 : 编写一个hello world !
查看>>
inet_ntoa、 inet_aton、inet_addr
查看>>
用模板写单链表
查看>>
用模板写单链表
查看>>
链表各类操作详解
查看>>
C++实现 简单 单链表
查看>>
数据结构之单链表——C++模板类实现
查看>>
Linux的SOCKET编程 简单演示
查看>>
正则匹配函数
查看>>
Linux并发服务器编程之多线程并发服务器
查看>>