# 1.什么是状态管理?

将浏览器与web服务器之间多次交互当作一个整体来处理,并且将多次交互所涉及的数据(即状态)保存下来。
(cookie浏览器所涉及到的访问数据保存下来
# 2.如何进行状态管理?

方式一 将状态保存在浏览器端(Cookie)。

方式二 将状态保存在服务器端(Session)。

# 3.Cookie
## (1)什么是Cookie?

服务器临时存放在浏览器端的少量数据。

## (2)工作原理

当浏览器访问服务器时,服务器将少量数据以set-cookie消息头的形式发送给浏览器,浏览器会将这些数据保存下来。
当浏览器再次访问服务器时,浏览器会将之前保存的这些数据以cookie消息头的形式发送给服务器

![](cookie.png)

## (3)添加Cookie

Cookie c = new Cookie(String name,String value);

注:Cookie只能存放字符串。

response.addCookie(c);

## (4)读取Cookie

Cookie[] request.getCookies();
注:
a. Cookie对象封装了cookie中的数据。
b. 该方法有可能返回null。
String cookie.getName();
String cookie.getValue();

## (5)Cookie的编码问题

a.Cookie只能保存合法的ascii字符,对于中文,需要转换成对应的ascii字符的形式。
String URLEncoder.encode(String str,String charset);
String URLDecoder.decode(String str,String charset);
b.建议,在添加cookie时,都统一编码处理。

## (6)Cookie的生存时间

a.默认情况下,浏览器会将Cookie保存在内存里面,只要浏览器不关闭,Cookie就会一直存在。如果浏览器关闭,Cookie就会被删除。
b.可以调用setMaxAge方法来设置Cookie的生存时间。
cookie.setMaxAge(int seconds);
注:
单位是秒 
值可以>0
浏览器会将cookie保存在硬盘上,
如果超过指定的时间,则浏览器会
删除该cookie。
<0
缺省值(浏览器会将cookie保存在内存里面)。
=0
删除cookie。比如要删除一个名称为
username的cookie:
Cookie c = new Cookie("username","");
c.setMaxAge(0);
response.addCookie(c);

## (7)cookie的路径问题

a.什么是Cookie的路径问题?
浏览器在向服务器上的某个地址发请求时,会比较该地址是否符合Cookie的路径的要求,只有符合条件的Cookie才会被发送。

b.Cookie的默认路径
等于添加该Cookie的web组件的路径,比如
/day06/biz01/addCookie1.jsp,则该jsp添加的cookie,默认路径是"/day06/biz01"。

c.匹配规则
只有当请求地址等于cookie的路径或者是其子路径时,浏览器才会将该cookie发送给服务器。
比如,cookie的路径是"/day06/biz01",则:
/day06/findCookie1.jsp   no
/day06/biz01/findCookie2.jsp  yes
/day06/biz01/sub/findCookie3.jsp yes

d.可以调用setPath方法来设置cookie的路径。
Cookie.setPath(String path);

练习:
写一个Servlet,先查看有没有一个名称为"cart"的cookie,如果有,则显示该cookie的值;如果没有,则添加该cookie。

统计用户访问某个应用的次数。

package web;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*需求说明:* 首先判断是否有cart这个属性和对应的属性名,若没有则用cookie类添加。*/
public class Find_addCookieServlet  extends HttpServlet{private static final long serialVersionUID = 1L;@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应文本的字符集
response.setContentType("text/html;charset=utf-8");
//设置输出文本对象
PrintWriter out=response.getWriter();
//用String ,因为客户端请求的内容可能有多条,获取所有请求的内容
Cookie[] cookies=request.getCookies();
if(cookies !=null) {
//有cookie,需要遍历,如果找不到名称为“cart”的cookie,需要添加。
boolean flag=false;//定义变量赋值
for(Cookie c:cookies) {
String name=c.getName();
if("cart".equals(name)) {//这样可以预防空指针,反过来可能...
//找到了,则显示该cookies的值
out.println(c.getValue());
flag=true;
}}
if(!flag){//如果上面为true,则这里为false,则不走。如果还为flase,则这里要走
//没有找到,需要添加。
Cookie c = new Cookie("cart","001");
response.addCookie(c);
}
}else {
//没有任何cookie,显然需要添加
Cookie c=new Cookie("cart","001");
response.addCookie(c);
}}}

## (8)cookie的限制

a.可能被用户禁止。
b.不安全。
对于敏感数据,如果要以cookie的方式保存在浏览器端,一定要加密处理。
c.只能保存少量数据。
大约是几K左右。
d.cookie的数据也有限制。
大约是几百个。
e.只能存放字符串。

# 1.session(会话)是什么?

服务器为了保存用户状态而创建的一个特殊的对象。

注:

当浏览器访问服务器时,服务器会创建一个session对象(该对象有一个唯一的id,一般称之为sessionId),接下来,服务器会将sessionId以cookie的方式发送给浏览器;

相比cookie更安全,并且更具可辨识性,但是加大了空间和时间的消耗

当浏览器再次访问服务器时,会将sessionId发送过来,服务器就可以利用sessionId找到对应的session对象。

# 2.如何获得session对象?(7月31日11点40)
## (1)方式一

HttpSession s = request.getSession(boolean flag);
注:
flag为true时:(...)
        先查看请求当中是否有sessionId,如果没有,则创建一个符合HttpSession接口要求的对象(即session对象);
如果有sessionId,则依据该sessionId查找对应的session对象,如果找到了,则返回该对象,如果找不到,则创建一个新的session对象。(可能有一个月没去kfc,服务器把它的内存清空了,但它有确实曾被分配过id,所以就创建一个对象)

flag为false时:(允许为空对象,只返回有的对象)
先查看请求当中是否有sessionId,如果没有,返回null;
如果有sessionId,则依据该sessionId查找
对应的session对象,如果找到了,则返回该对象,如果找不到,返回null。

## (2)方式二

HttpSession s = request.getSession();
等价于 request.getSession(true);

# 3.常用方法
String  session.getId();//获得sessionId
session.setAttribute(String name,Object obj);//绑定数据  name绑定名   obj是绑定值
Object session.getAttribute(String name);//依据绑定名获得绑定值,若绑定值不存在,则返回null
session.removeAttribute(String name);//解除绑定
![](count.png)

# 4.session超时

a.什么是session超时?
服务器会将空闲时间过长的session对象删除掉。
目的是为了节省内存空间。
b.缺省的超时时间,大部分服务器默认是30分钟。
c.可以修改超时时间长度。

比如,修改tomcat的web.xml文件

参看如下代码,通常不建议修改,但若修改的话,最好只是针对某一个具体的web应用

<session-config>
        <session-timeout>30</session-timeout>
    </session-config>

d.setMaxInactiveInterval(int seconds)

//两次请求的时间最大的时间间隔不能超过这个长度

设置两次请求之间的最大间隔时间,如果超过这个间隔时间,session对象会被删除。

# 5.删除session对象

session.invalidate();//无效的日期         要重新创建对象

# 6.session验证

##登录

用户填写用户名和密码并提交,服务器端依靠用户名和密码查询数据库,若有符合条件的记录,则登录成功,

返回一个欢迎页面;否则登录失败并给出提示。

step1.登录成功之后,在session对象上绑订相关数据。比如:

session.setAttribute("user",user);

//绑定session对象的名字和值

step2.当用户访问需要保护的资源(比如,访问用户列表),则进行session验证:

Object obj = session.getAttribute("user");
if(obj == null){
//没有登录    为什么是空对象相比?不是比两个对象相等吗?
response.sendRedirect("login.jsp");
}

# 7.比较session和cookie

session相对于cookie,优点是存放更多的数据,
支持更丰富的数据类型,更安全;缺点是可能会占用过多的内存空间。

注:cookie只能放字符串,...

# 8.过滤器
## (1)过滤器是什么?

Servlet规范当中定义的一种特殊的组件,用来拦截Servlet容器的调用过程。
注:
当请求到达容器之后,如果有过滤器的话,容器会先调用过滤器。

## (2)如何写过滤器。
step1.写一个java类,实现Filter接口。
step2.在doFilter方法里面,编写相应的拦截处理逻辑。
step3.配置过滤器(web.xml)。

转载于:https://www.cnblogs.com/shijinglu2018/p/9420735.html

状态管理之cookie使用及其限制、session会话相关推荐

  1. 【转】【C#.NET】ASP.NET状态管理之一:Cookie

    [C#.NET]ASP.NET状态管理之一:Cookie 状态管理是你对同一页或不同页的多个请求维护状态和页信息的过程.与所有基于 HTTP 的技术一样,Web 窗体页是无状态的,这意味着它们不自动指 ...

  2. ASP.NET状态管理之五(Cookie)

    Cookie 提供了一种在 Web 应用程序中存储用户特定信息的方法. 例如,当用户访问您的站点时,您可以使用 Cookie 存储用户首选项或其他信息.当该用户再次访问您的网站时,应用程序便可以检索以 ...

  3. JSP状态管理 及 Cookie实例

    HTTP协议的无状态性 无状态是指,当浏览器发送请求给服务器的时候,服务器响应客户端的请求. 但是当同一个浏览器再次发送请求给了服务器的时候,服务器并不知道它就是刚才那个浏览器. 简单地说,就是服务器 ...

  4. ASP.NET状态管理之一(概括篇)

    每次将网页发送到服务器时,都会创建网页类的一个新实例.在传统的Web编程中,这通常意味着在每一次往返行程中,与该页及该页上的控件相关联的所有信息都会丢失.例如,如果用户将信息输入到文本框,该信息将在从 ...

  5. python:http.cookies --- HTTP状态管理

    python:http.cookies --- HTTP状态管理 简介 Cookie 对象 Morsel 对象 示例 简介 http.cookies 模块定义的类将 cookie 的概念抽象了出来,这 ...

  6. HTTP 协议入门 — (TCP/IP协议族、通信传输流、URI 与 URL 的区别、Cookie 状态管理、HTTP 支持的方法、状态码类别、HTTP 首部字段)

    TCP/IP协议族 在介绍 HTTP 协议之前,我们先对 TCP/IP 协议族有个大概的了解,TCP/IP 协议从上到下主要分为应用层.传输层.网络层和数据链路层,各层的主要功能如下表所示: 协议层 ...

  7. http相关知识 - (2)状态管理 - session

    http相关知识 - (2)状态管理 - session 1. Session原理 (1)Session用于存储特定的用户会话所需的信息.Session对象的引入是为了弥补无状态HTTP协议的不足. ...

  8. 状态管理技术~~Session

    一.什么是session session用于跟踪客户的状态 session指的是在同一段时间,单个客户与web服务器的一连串的交互过程 在一个session中,客户可能会多次请求访问同一个网页,也可能 ...

  9. Django边学边记--状态保持(cookie和session)

    Cookie 概念: Cookie,也叫Cookies,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密),好比会员卡或餐票. 特点: Cookie是由服务 ...

最新文章

  1. 基于redis分布式锁实现“秒杀”
  2. Shell生成随机数并输出文件对应行
  3. Spring 的 Controller 是单例还是多例?怎么保证并发的安全
  4. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | Hook 点分析 )
  5. c语言指针地址交换程序,C语言-基础教程-指针的地址分配
  6. JBuilder配置JBoss
  7. 显示客户端接收什么服务器,什么是显示服务器,用来做什么?
  8. python 网盘搭建_Python无所不能?五分钟教会你用python打造个人云盘!
  9. 现在更新鸿蒙会成为小白鼠吗,安卓11.0被停用,鸿蒙OS即将登上,花粉:宁愿当小白鼠...
  10. CSDN账号登录异常,一个网址帮你找回账号
  11. POJ3764(树上前缀和+Trie树)
  12. 通过制作一个登录界面学习matlab app designer的基础使用方法
  13. Linux之/etc/login.defs创建用户默认设置文件介绍
  14. 国内怎么captcha测试_通过简单的数字测试或PHP图像处理使CAPTCHA更友好
  15. cad面积计算机,CAD中如何计算面积,计算面积的方法和命令汇总
  16. (基因功能 基因表达调控)研究方案
  17. 一个中国方案的落地:马云的eWTP,如何让马来西亚第一个all in
  18. 教你用PixiJs实现复杂动画
  19. 测试学习-119-使用Excel做好看的报告图
  20. 伯克利人工智能研究:针对深度神经网络的物理对抗例子

热门文章

  1. 算法中的算子是什么意思,图像处理一样理解
  2. 大文件上传 进度条显示(仿CSDN资源上传效果) .
  3. 深度学习-为什么用激活函数
  4. CS224n——lecture3课程导学
  5. Java实现词频统计(Wordcount)-Map或Hashtable的value排序
  6. 九九乘法表下半三角(C语言)
  7. 机器学习实战:PCA降维 样本协方差
  8. 罗德里格斯(Rodrigues)旋转方程推导
  9. UEFI+GPT与BIOS+MBR的优缺点
  10. 【opencv学习】完全基于opencv的双目景深与测距的实现