会话技术
cookie
1 处理post请求乱码问题:
request.setCharacterEncoding(“utf-8”)
2 会话技术
- 会话:user 打开浏览器,访问web服务器资源,会话建立,直到一方断开连接,会话结束,一次会话中可包含多次请求和响应。
- 会话跟踪:是维护浏览器状态的方法,辨别多次请求是否来自同一浏览器,以便同一会话多次请求间共享数据。
- HTTP协议:是无状态的,每次请求都会被视为新的请求,需会话跟踪技术实现会话内数据共享。
- 实现方法: 1.客户端跟踪技术 Cookie 2.服务器端会话跟踪技术 Session
3 Cookie的基本使用
定义:客户端技术,数据存在客户端,每次请求都携带Cookie数据进行访问。
基本使用:
发送Cookie
1.创建Cookie对象,设置数据
Cookie cookie=new Cookie("key","value");
2.发送Cookie到客户端,使用response对象
response。addCoookie(cookie);
获取Cookie
-
获取客户端携带的所有cookie,使用request对象
Cookie[] cookies = request.getCookies();
-
遍历数组,获取每一个Cookie对象:for
使用Cookie对象方法获取数据
cookie.getName(); cookie.getValue();
创建Maven项目,pom.xml依赖
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <!--servlet--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!--jsp--> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency> <!--jstl--> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </build>
4 Cookie原理
-
HTTP协议
-
响应头:set-cookie
-
请求头: cookie
过程;
-
AServlet给前端发送Cookie,BServlet从request中获取Cookie的功能
-
对于AServlet响应数据的时候,Tomcat服务器都是基于HTTP协议来响应数据
-
当Tomcat发现后端要返回的是一个Cookie对象之后,Tomcat就会在响应头中添加一行数据==
Set-Cookie:username=zs
== -
浏览器获取到响应结果后,从响应头中就可以获取到
Set-Cookie
对应值username=zs
,并将数据存储在浏览器的内存中 -
浏览器再次发送请求给BServlet的时候,浏览器会自动在请求头中添加==
Cookie: username=zs
==发送给服务端BServlet -
Request对象会把请求头中cookie对应的值封装成一个个Cookie对象,最终形成一个数组
-
BServlet通过Request对象获取到Cookie[]后,就可以从中获取自己需要的数据
Cookie的使用细节
Cookie存活时间:
-
默认状态Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁。
-
设置Cookie存活时间
-
setMaxAge(int seconds):持久储存,提供好了对应的API来完成
1.正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
2.负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
3.零:删除对应Cookie
-
Cookie存储中文:
Cookie默认不支持中文,可用URL的编码和解码完成
编码: String value = "张三"; //对中文进行URL编码 value = URLEncoder.encode(value, "UTF-8"); System.out.println("存储数据:"+value); //将编码后的值存入Cookie中 Cookie cookie = new Cookie("username",value); 解码:String value = cookie.getValue();//获取的是URL编码后的值 //URL解码 value = URLDecoder.decode(value,"UTF-8"); System.out.println(name+":"+value);//value解码后为 张三
session
5.2 Session销毁
session的销毁会有两种方式:
-
默认情况下,无操作,30分钟自动销毁
<!--Session销毁时间设置,默认时间为30min--> <session-config> <session-timeout>30</session-timeout> </session-config>
-
对于这个失效时间,是可以通过配置进行修改的
//获取数据,从session中 //1. 获取Session对象 HttpSession session = request.getSession(); System.out.println(session); // 销毁 session.invalidate(); //2. 获取数据 Object username = session.getAttribute("username"); System.out.println(username); }
Cookie和Session小结
Cookie和Session小结
-
Cookie 和 Session 都是来完成一次会话内多次请求间的数据共享
所需两个对象放在一块,就需要思考:
-
区别:
-
存储位置:Cookie 是将数据存储在客户端,Session 将数据存储在服务端
-
安全性:Cookie不安全,Session安全
-
数据大小:Cookie最大3KB,Session无大小限制
-
存储时间:Cookie可以通过setMaxAge()长期存储,Session默认30分钟
-
服务器性能:Cookie不占服务器资源,Session占用服务器资源
-
-
应用场景:
-
购物车:使用Cookie来存储
-
以登录用户的名称展示:使用Session来存储
-
记住我功能:使用Cookie来存储
-
验证码:使用session来存储
-
-
结论
-
Cookie是用来保证用户在未登录情况下的身份识别
-
Session是用来保存用户登录后的数据
-