版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33945246/article/details/79764487
01 前言
- 之所以要对JSP各个用户的状态进行管理,主要是由于
- HTTP协议的无状态性
- 同一个浏览器发送两次请求给服务器的时候,服务器并不知道是同一个浏览器发送给服务器的
02 JSP状态管理
- 保存用户的两个方式session和cookie
2.1 cookie
介绍
1. cookie是web服务器保存在客户端的一系列文本信息
2. 典型应用一:判断注册用户是否已经登陆网站
3. 典型应用二:购物车的处理:即保存用户在不同页面的浏览信息使用
- 创建cookie
Cookie newcookie = new Cookie(String key ,Object value);
- 写入cookie对象(服务端传cookie给客户端)
response.addCookie(newCookie);
3.读取cookie(客户端读取cookie)
Cookie[] cookies = request.getCookies();
4.cookie常用方法:
- 创建cookie
2.2 session
- 表示客户端与服务器的一次会话,
- 具体到web中的session指的就是用户在浏览一个网站时,从进入网站到浏览器关闭所经历的这段时间
- session是保存在服务器的内存中,同时一个用户对应一个session,客户与session是一一对应的
- session对象是jsp的内置对象,在用户打开第一个jsp页面时自动创建,完成会话期管理
- 服务器通过session对象来确定在不同页面切换的是否是同一个用户
- 常用方法:
- long getCreationTime() 返回session创建的时间(毫秒)
- public String getId() 返回session创建时jsp引擎为他设定的唯一id号
- Public Object setAttribute(String name,Object value) 使用指定名称将对象绑定到此会话
- Public Object getAttribute(String name) 返回与此会话中指定名称绑定在一起的对象,没有返回null
- String[] getValueNames() 返回一个包含session所有可用属性的数组
- int getMaxInactiveInterval() 返回两次请求间隔多长时间此session被取消
- void setMaxInactiveInterval()通过此方法设定session最长生存周期,单位是秒
2.3 session跟cookie的对比:
2.4 session的生命周期
- 创建:第一次打开jsp或者servlet,session会被创建
- 活动:
- 某次会话当中通过超链接打开新页面,属于同一个会话
- 当前会话页面没有全部关闭,属于同一个会话
- 当本次会话所有页面都关闭,在重新访问jsp或者servlet将会创建新的会话,
- 但要注意的是,原有会话不会关闭,这个旧的sessionid仍然存在服务器,只不过再也没有客户端会携带它交付服务端校验
- 销毁:session销毁只有三种方式:
- 调用session.invalidate()方法
- session过期,超时
- 服务器重新启动
- 服务器超时有两种方法
- 通过setMaxInactiveInterval()方法设定session活动时间
- 在web.xml文件中配置,写如下语句:
<session-config>
<session-timeout>
10//该时间的单位是分钟
</session-timeout>
</session-config>
03 补充
3.1 get和post方法的区别
<form name="regForm" action="动作" method="提交方法"></form>
- 其中method后面跟着的参数就是get或者post
- get:以明文的方式通过URL提交数据,数据在URL中可以看到,提交数据量最多不超过2K。安全性低但效率比post方式高,适合数据量不大,安全性不高的数据,比如:搜索,查询等功能
- post:将用户提交的信息封装在html header内,适合提交数据量大,安全性高的用户信息,比如:注册,修改,上传等功能
- 注:通过get方法提交的数据,会出现在url中,这样造成用户数据的泄露
3.2 请求转发与请求重定向
- 请求重定向:客户端行为,respond.sendRedirect(),从本质上讲等同于两次请求,前一次的请求的对象不会保存,地址栏的url地址会改变
- 请求转发:服务器行为,requset.getRequestDispatcher().forward(req,resp),是一次请求,转发后请求对象会保存,地址栏的url地址不会改变
- 注意在写请求转发的时候,不要漏掉forward