状态管理之cookie使用及其限制、session会话
# 1.什么是状态管理?
将浏览器与web服务器之间多次交互当作一个整体来处理,并且将多次交互所涉及的数据(即状态)保存下来。
(cookie浏览器所涉及到的访问数据保存下来)
# 2.如何进行状态管理?
方式一 将状态保存在浏览器端(Cookie)。
方式二 将状态保存在服务器端(Session)。
# 3.Cookie
## (1)什么是Cookie?
服务器临时存放在浏览器端的少量数据。
## (2)工作原理
当浏览器访问服务器时,服务器将少量数据以set-cookie消息头的形式发送给浏览器,浏览器会将这些数据保存下来。
当浏览器再次访问服务器时,浏览器会将之前保存的这些数据以cookie消息头的形式发送给服务器。

## (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);//解除绑定

# 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)。
状态管理之cookie使用及其限制、session会话的更多相关文章
- JSP状态管理 及 Cookie实例
HTTP协议的无状态性 无状态是指,当浏览器发送请求给服务器的时候,服务器响应客户端的请求. 但是当同一个浏览器再次发送请求给了服务器的时候,服务器并不知道它就是刚才那个浏览器. 简单地说,就是服务器 ...
- ASP.NET-【状态管理】-Cookie小结
Cookie路径 谷歌浏览器 依次点击设置--高级选项--内容设置--cookies--选择“显示cookies和其他网站数据”按钮就可以看到了 C:\Users\Administrator\Loca ...
- 基于cookie的用户登录状态管理
cookie是什么 先来花5分钟看完这篇文章:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies 看完上文,相信大家对cookie已经有 ...
- HttpClient_HttpClient 4.3.6 HTTP状态管理
HTTP状态管理 最初的HTTP被设计成以状态.请求/应答为导向的协议,它被制作成是没有特殊条款的,以便在状态会话中能交换逻辑关系请求/应答.HTTP协议越来越受欢迎和被采用,越来越多的系统会在应用程 ...
- httpclient http状态管理
HTTP状态管理 最初,Htt被设计成一个无状态的面向请求响应的协议,所以它不能再逻辑相关的http请求/响应中保持状态会话. 由于越来越多的系统使用http协议,其中包括http从来没有想支持的系统 ...
- 转载ASP.NET 状态管理Application,Session,Cookie和ViewState用法
转载原地址 http://www.cnblogs.com/cuishao1985/archive/2009/09/24/1573403.html ASP.NET状态管理 APPlication,Ses ...
- [Asp.Net]状态管理(Session、Application、Cache)
上篇博文介绍了在客户端状态管理的两种方式:http://www.cnblogs.com/wolf-sun/p/3329773.html.除了在客户端上保存状态外,还可以在服务器上保存状态.使用客户端的 ...
- [Asp.Net]状态管理(ViewState、Cookie)
简介 HTTP协议是无状态的.从客户端到服务器的连接可以在每个请求之后关闭.但是一般需要把一些客户端信息从一个页面传送给另一个页面. 无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请 ...
- Unit07: 状态管理-Session
Unit07: 状态管理-Session web package web; import java.io.IOException; import java.io.PrintWriter; import ...
随机推荐
- [py]python的time和datetime模块获取星期几
import time import datetime #今天星期几 today=int(time.strftime("%w")) print today #某个日期星期几 any ...
- 抛异常 throw的注意事项
子类覆盖父类只能抛出父类的异常或者子类或者子集注意:如果父类的方法没有抛异常,那么子类覆盖时绝对不能抛. 子类继承父类时,方法抛异常,要么抛父类,要么抛父类下的子类,不能抛父类平级或以上的异常 原因是 ...
- "pip3 install requests"
后续设置参考 “selenium python3” https://www.cnblogs.com/jpr-ok/p/10108231.html
- PHP DDOS的UDP攻击,TCP攻击,和CC攻击的核心代码
网络安全向,请勿用作非法用途 CC攻击模块: <?phpecho “状态 : 正常运行中…..<br>”;echo “================================ ...
- CentOS6.5安装sqoop2
1.下载软件:http://archive.cloudera.com/cdh5/cdh/5/ 2.解压:tar -zxvf mysofts/sqoop2-1.99.5-cdh5.6.0.tar.gz ...
- NPOI设置单元格格式
转自:http://www.cr173.com/html/18143_2.html //创建一个常用的xls文件 private void button3_Click(object sender, E ...
- jmeter 二次开发---实现自定义函数插件
1.前提: 有时候,Jmeter自带的函数,可能不能满足于业务的需求,这时候,我们可以自己写一个函数插件: 2.创建maven工程 一直next,输入GroupID,ArtifactId->fi ...
- 前端获取的数据是undefined
var id = $("id1").val(); var username = $("username1").val(); var password = $(& ...
- layui透明弹框
效果: layui.use('layer', function () { var layer = layui.layer; var str = '<div>'; str += '<d ...
- DataGridView控件用法合集
1.当前的单元格属性取得.变更 Console.WriteLine(DataGridView1.CurrentCell.Value) Console.WriteLine(DataGridView1.C ...