servlet会话技术:Cookie
什么是会话
会话可以简单理解为:用户开一个浏览器访问某个网站,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
会话过程中需要解决的一些问题
每个用户在使用浏览器与服务器进行会话的过程中,不可避免的各自会产生一些数据,服务器要想办法为每个用户保存这些数据。例如:多个用户点击超链接通过一个servlet各自购买了一个商品,服务器应该想办法把每一个用户购买的商品保存在各自的地方,以便于这些用户点击结账servlet时,结账servlet可以得到用户各自购买的商品为用户各自购买的商品结账。
为什么需要会话技术
1.如何保存用户上次登录时间
2.如何显示用户浏览历史
3.如何把登录的用户名和密码保存电脑,下次登录无需从新输入。
保存用户名:
public class CreateCookie extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//创建保存用户名的cookie,cookie是在服务端创建的
Cookie cookie = new Cookie("name", "zhangsan");
//设置cookie的生命周期,有效时间
cookie.setMaxAge(3600);
//把cookie信息回写给浏览器
response.addCookie(cookie);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request,response);
}
}
第一次访问CreateCookie的http响应
HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: name=zhangsan; Expires=Mon, 18-Apr-2016 12:33:18 GMT Content-Length: 0 Date: Mon, 18 Apr 2016 11:33:18 GMT
cookie文件内容
name zhangsan localhost/cookie/ //web应用 1536 2084092672 30513518 452421040 30513510 *
cookie保存在客户端浏览器的缓存目录下
那么怎么读取cookie文件呢
public class ReadCookie extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
//读取所有的cookie信息,选取你需要的cookie
Cookie[] cookies = request.getCookies();
//遍历cookies
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
out.println("cookie 的信息 name = "+cookie.getName()+" value = "+cookie.getValue());
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request,response);
}
}
访问ReadCookie的http请求
GET /cookie/ReadCookie HTTP/1.1 Accept: */* Accept-Language: zh-CN User-Agent: Mozilla/4.0 Accept-Encoding: gzip, deflate Host: localhost:8080 Connection: Keep-Alive Cookie: name=zhangsan
request.getCookies()可以从http请求中获取所有的cookie Cookie的原理图
Cookie的小结
①Cookie是在服务器端创建的。
②Cookie是保存在浏览器这一端的。
③Cookie的生命周期可以通过cookie.setMaxAge(2000); 设置。
如果不设置,该cookie的生命周期当浏览器关闭时就消亡。
④Cookie是可以被多个浏览器共享的。
⑤怎么理解
我们可以把cookie想成一张表:
如果cookie重名会有什么问题?
重名会替换原来的值。
⑥一个站点可以保存多个cookie
⑦Cookie存放时是以明文方式存放的,因此安全性比较低。我们可以通过加密后在保存。
记录用户上次登录时间
public class Servlet1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
//读取cookie
Cookie[] cookies = request.getCookies();
//假设记录上次登录时间的cookie的形式是"lasttime"="2011-11-11 11:11:11"
//这里需要考虑一种情况,就是第一次登录
boolean flag = false;//没有找到
if (cookies != null) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
if ("lasttime".equals(name)) {
out.println("您上次登录时间是" + cookie.getValue());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowTime = simpleDateFormat.format(new Date());
cookie.setValue(nowTime);
cookie.setMaxAge(7 * 3600 * 24);
response.addCookie(cookie);
flag = true;
break;
}
}
}
if (!flag) {
//没有找到,用户是第一次登录
out.println("欢迎您第一次登录");
//创建cookie
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowTime = simpleDateFormat.format(new Date());
Cookie cookie = new Cookie("lasttime", nowTime);
cookie.setMaxAge(7 * 3600 * 24);
response.addCookie(cookie);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
}
记住用户名和密码:
Login.java
public class Login extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
String name = "";
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("name")) {
name = cookie.getValue();
}
}
}
out.println("<form action='/cookie/LoginCl' method='post'>");
out.println("name:<input type='text' name='name' value='"+name+"'><br/>");
out.println("pwd:<input type='password' name='passwd'><br/>");
out.println("<input type='checkbox' name='iskeepinfo' value='keep'>在此电脑上保存用户名<br/>");
out.println("<input type='submit' value='submit'>");
out.println(" </form>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
}
LoginCl.java
public class LoginCl extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
//用户是否勾选保存用户名
String name = request.getParameter("name");
String pwd = request.getParameter("passwd");
String val = request.getParameter("iskeepinfo");
if (val != null && "keep".equals(val)) {
//需要保存用户名
//创建Cookie保存用户名
Cookie cookie = new Cookie("name", name);
cookie.setMaxAge(2 * 7 * 24 * 3600);
response.addCookie(cookie);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
}
Cookie深入讨论:
1.一个cookie只能保存字符串信息,其结构是
Cookie(java.lang.String name,java.lang.String value)
2.一个浏览器最多放入300个cookie,一个站点最多20个cookie 每个cookie大小限制在4K以内。
3.Cookie生命周期
--Cookie默认生命周期是会话级别的,用户退出浏览器之后就被删除。
--通过setMaxAge()可以设置生命周期
----setMaxAge(正数) 即多少秒后该cookie失效
----setMaxAge(0) 删除该cookie
Cookie[] cookies = request.getCookies();
for(Cookie cookie:cookies){
if("id".equals(cookie.getName())){
cookie.setMaxAge(0);//删除
response.addCookie(cookie);//回写浏览器,否则不生效
break;
}
}
如果该web应用中只有一个cookie 则该cookie删除后,浏览器的临时文件夹下就没有了该cookie文件。如果一个web应用中有多个cookie,该cookie被删除文件还在。
setMaxAge(负数),相当于该cookie的生命周期是会话级的。
3.Cookie存放中文怎么处理
存放时:
String val = java.net.URLEncoder.encode("张三","UTF-8");
Cookie cookie = new Cookie("uname",val);
取出时:
String val = java.net.URLEncoder.decode(cookie.getValue(),"UTF-8");
Out.println("uname="+val);
servlet会话技术:Cookie的更多相关文章
- Servlet 会话技术cookie和session
会话技术 Cookie技术:会话数据保存在浏览器客户端. Session技术:会话数据保存在服务器端. 一.Cooke技术 1. 特点 Cookie技术:会话数据保存在浏览器客户端. 2 .Cooki ...
- 会话技术cookie与session
目录 会话技术cookie 会话技术 cookie 服务器怎样把Cookie写 给客户端 服务器如何获取客户端携带的cookie session session简介 Session如何办到在一个ser ...
- Java EE会话技术Cookie和Session
会话技术 一.定义 会话技术是帮助服务器记住客户端状态的(区分客户端的).将客户访问的信息存在本地的叫Cookie技术,存在服务器上的叫Session技术. 注意: 一次会话何时开始?从打开一个浏览器 ...
- java ->会话技术Cookie&Session
会话技术Cookie&Session 会话技术简介 存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户 ...
- 会话技术cookie和session详解
什么是会话 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 会话技术解决了什么问题 每个用户与服务器进行交互的过程中,各自会有一 ...
- JavaWeb学习笔记五 会话技术Cookie&Session
什么是会话技术? 例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态.会话 ...
- 会话技术Cookie
1.会话技术 1>什么是会话技术: 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话. 2>作用: 会话技术就是记录这次会话中客户端的状态与数据的. Cookie:数 ...
- 会话技术: Cookie 和 Session
会话技术 会话技术:从浏览器开始访问服务器,到关闭浏览器,这期间发生了许多次请求和响应,这个过程就叫做一次会话. Cookie 和 Session 都是处理会话技术的两种具体实现,Cookie将数据保 ...
- JAVA基础之会话技术-Cookie及Session
至此,学习Servlet三个域对象:ServletContext(web项目).request(一次请求).Session(一个客户端)!均有相同的方法! 从用户开始打开浏览器进行操作,便开始了一次会 ...
随机推荐
- selenium+python 浏览器标签页跳转 switch_to_window
浏览器页面跳转方法记录: from selenium import webdriver import time browser = webdriver.Chrome() first_url='http ...
- 【Web学习日记】——C#引用WebService,从配置文件改变引用地址
开发环境:Win7 32位,开发工具:VS2013,.Net:4.0 初用WebService,很多地方都搞不清楚怎么回事,但稍作研究之后,也就用上了,根本就没有考虑后续事情. 但是,随着项目的进行, ...
- Android修改system只读权限
在Root后的真机上使用adb remount命令不知道为什么不行. 但有些时候还是想向system文件夹下面写文件,例如把tcpdump工具放到/system/bin 下面,然后就可以直接使用tcp ...
- .NET序员的成长之路
- centos 64位linux系统下安装appt命令
首先,安装apktool包 1. wget http://android-apktool.googlecode.com/files/apktool-install-linux-r04-brut1.ta ...
- 【经验】Angularjs 中使用 layDate 日期控件
layDate 控件地址:http://laydate.layui.com/ 前情:原来系统中使用的日期控件是UI bootstrap(地址:https://angular-ui.github.io/ ...
- 关于MDK中:RO-data、RW-data、ZI-data
最近在LPC2109上调试ENC28J60,协议栈使用的是UIP,刚开始用的telnet服务,能够正常编译运行.然后换成webserver提示: enc28j60.axf: Error: L6406E ...
- word小技巧
如何将英文和数字替换为times new romans 1,点击替换(ctrl+H) .2,在查找内容中输入”([A-Z0-9])“(不包括引号,但包括小括号),这是替换所有大写字母和数字,如果还想替 ...
- Codeforces Round #343 (Div. 2) E. Famil Door and Roads
题目链接: http://www.codeforces.com/contest/629/problem/E 题解: 树形dp. siz[x]为x这颗子树的节点个数(包括x自己) dep[x]表示x这个 ...
- 新建标准mavenWeb工程以及Maven的web应用标准目录结构建议
到现在为止,使用Maven结构的Web工程越来越多,因此在此介绍一下通过Maven来构建项目的相关知识. 文档主要分为两部分: 1.如何通过maven来构建多模块的web项目 ...