Servle第四篇(会话技术之cookie)
会话技术
什么是会话技术
基本概念: 指用户开一个浏览器,访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直到用户关闭浏览器,整个这个过程我们称为一次会话.
为什么我们要使用会话技术?
- 在论坛登陆的时候,很多时候会有一个小框框问你是否要自动登陆,当你下次登陆的时候就不用输入密码了
- 根据我以前浏览过的商品,猜我喜欢什么商品
Cookie
会话跟踪技术有Cookie和Session,Cookie技术是先出现的。我们先讲Cookie技术吧。
什么是Cookie
Cookie是由W3C组织提出,最早由netscape社区发展的一种机制
网页之间的交互是通过HTTP协议传输数据的,而Http协议是无状态的协议。无状态的协议是什么意思呢?一旦数据提交完后,浏览器和服务器的连接就会关闭,再次交互的时候需要重新建立新的连接。
服务器无法确认用户的信息,于是乎,W3C就提出了:给每一个用户都发一个通行证,无论谁访问的时候都需要携带通行证,这样服务器就可以从通行证上确认用户的信息。通行证就是Cookie
Cookie的流程:浏览器访问服务器,如果服务器需要记录该用户的状态,就使用response向浏览器发送一个Cookie,浏览器会把Cookie保存起来。当浏览器再次访问服务器的时候,浏览器会把请求的网址连同Cookie一同交给服务器。
Cookie API
Cookie类用于创建一个Cookie对象
response接口中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段
request接口中定义了一个getCookies方法,它用于获取客户端提交的Cookie
常用的Cookie方法:
public Cookie(String name,String value)
setValue与getValue方法
setMaxAge与getMaxAge方法
setPath与getPath方法
setDomain与getDomain方法
getName方法
简单使用Cookie
创建Cookie对象,发送Cookie给浏览器、
记得设置有效期setMaxAge()
response.setContentType("text/html;charset=UTF-8");
Cookie cookie=new Cookie("username", "yolo");
cookie.setMaxAge(1000);
response.addCookie(cookie);
response.getWriter().write("我已向浏览器发送cookie");
Cookie细节
Cookie不可跨域名性
浏览器判断一个网站是否能操作另一个网站的Cookie的依据是域名。所以一般来说,当我访问baidu的时候,浏览器只会把baidu颁发的Cookie带过去,而不会带上google的Cookie。即使是同一级域名,不同二级域名也不能交接
Cookie保存中文
中文属于Unicode字符,英文数据ASCII字符,中文占4个字符或者3个字符,英文占2个字符。
解决:Cookie使用Unicode字符时需要对Unicode字符进行编码---------Cookie cookie=new Cookie("username", URLEncoder.encode(name,"UTF-8"));
取出Cookie的时候要对中文数据进行解码--------
Cookie的有效期
如果MaxAge为正数,浏览器会把Cookie写到硬盘中,只要还在MaxAge秒之前,登陆网站时该Cookie就有效【不论关闭了浏览器还是电脑】
如果MaxAge为负数,Cookie是临时性的,仅在本浏览器内有效,关闭浏览器Cookie就失效了,Cookie不会写到硬盘中。Cookie默认值就是-1。这也就为什么在我第一个例子中,如果我没设置Cookie的有效期,在硬盘中就找不到对应的文件。
如果MaxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie对应的方法,把MaxAge设置为0等同于删除Cookie
Cookie的修改和删除
Cookie的名称相同,通过response添加到浏览器中,会覆盖原来的Cookie。
删除时也要addCookie
注意:删除,修改Cookie时,新建的Cookie除了value、maxAge之外的所有属性都要与原Cookie相同。否则浏览器将视为不同的Cookie,不予覆盖,导致删除修改失败!
Cookie的域名
Cookie的domain属性决定运行访问Cookie的域名。domain的值规定为“.域名”
希望同一级域名可以访问------cookie.setDomain(".zhongfucheng.com");
Cookie的路径
Cookie的path属性决定允许访问Cookie的路径--------使用Servlet2颁发一个Cookie给浏览器,设置路径为"/Servlet1"。
Cookie的安全属性
HTTP协议不仅仅是无状态的,而且是不安全的!如果不希望Cookie在非安全协议中传输,可以设置Cookie的secure属性为true,浏览器只会在HTTPS和SSL等安全协议中传输该Cookie。
当然了,设置secure属性不会将Cookie的内容加密。如果想要保证安全,最好使用md5算法加密
Cookie的应用
显示用户上次访问的时间
其实就是每次登陆的时候,取到Cookie保存的值,再更新下Cookie的值。
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
response.setContentType("text/html;charset=UTF-8");
PrintWriter printWriter=response.getWriter(); Cookie[] cookies=request.getCookies(); String cookieValue=null;
for(int i=0;cookies!=null&&i<cookies.length;i++){
if(cookies[i].getName().equals("time")){
printWriter.write("您上次登录的时间是");
cookieValue=cookies[i].getValue();
printWriter.write(cookieValue); cookies[i].setValue(simpleDateFormat.format(new Date()));
response.addCookie(cookies[i]); break;
}
} if(cookies==null){
Cookie cookie=new Cookie("time",simpleDateFormat.format(new Date()));
cookie.setMaxAge(2000);
response.addCookie(cookie);
printWriter.write("您是第一次登陆");
}
}
显示上次浏览过商品
1、新建一个Book类
public class Book { private String id;
private String name;
private String author; public Book(){ } public Book(String id,String name,String author){
this.id=id;
this.name=name;
this.author=author;
}
各种get,setXxx
2、数据库类DB
public class DB {
private static LinkedHashMap<String, Book> linkedHashMap=new LinkedHashMap<String, Book>();
static{
linkedHashMap.put("1", new Book("1", "javaWeb", "y"));
linkedHashMap.put("2", new Book("2", "Servlet", "o"));
linkedHashMap.put("3", new Book("3", "JSP", "l"));
linkedHashMap.put("4", new Book("4", "SQL", "陈"));
}
public static LinkedHashMap<String, Book> getAll(){
return linkedHashMap;
}
}
3、首页的代码(读取数据库显示,读取cookies)
//实现展示书籍并配超链接
response.setContentType("text/html;charset=UTF-8");
PrintWriter printWriter=response.getWriter();
printWriter.write("网页上所有的书籍"+"<br/>");
LinkedHashMap<String,Book> linkedHashMap=DB.getAll();
Set<Map.Entry<String, Book>> entry=linkedHashMap.entrySet(); for(Map.Entry<String, Book> stringBookEntry:entry){
Book book=stringBookEntry.getValue();
printWriter.write("<a href='/firstServlet/Demo?id="+book.getId()+"''target=_blank'>"+book.getName()+"</a>");
printWriter.write("<br/>");
} //显示历史记录
printWriter.write("您浏览过的商品有");
printWriter.write("<br/>"); Cookie[] cookies=request.getCookies();
for(int i=0;cookies!=null&&i<cookies.length;i++){
if(cookies[i].getName().equals("bookHistory")){
String bookHistory=cookies[i].getValue();
String[] ids=bookHistory.split("\\_"); for(String id:ids){
Book book=linkedHashMap.get(id);
printWriter.write(book.getName());
printWriter.write("<br/>");
}
break;
}
}
4、超链接跳转后处理数据
private String makeHistory(HttpServletRequest request,String id){
String bookHistory=null;
Cookie[] cookies=request.getCookies();
//找到匹配的cookies
for(int i=0;cookies!=null&&i<cookies.length;i++){
if(cookies[i].getName().equals("bookHistory")){
bookHistory=cookies[i].getValue();
}
}
if(bookHistory==null){
return id;
}
String[] strings=bookHistory.split("\\_");
//为了方便增删减改
List<String> list=Arrays.asList(strings);
LinkedList<String> linkedList=new LinkedList<String>();
linkedList.addAll(list);
//排序
if(linkedList.contains(id)){
linkedList.remove(id);
linkedList.addFirst(id);
}else if(linkedList.size()>=3){
linkedList.removeLast();
linkedList.addFirst(id);
}else{
linkedList.addFirst(id);
}
//拼接
StringBuffer stringBuffer=new StringBuffer();
for(String s:linkedList){
stringBuffer.append(s+"_");
}
return stringBuffer.deleteCharAt(stringBuffer.length()-1).toString();
}
5、超链接页面显示以及将处理后的数据存到cookie
response.setContentType("text/html;charset=UTF-8");
String id=request.getParameter("id");
Book book=(Book)DB.getAll().get(id); PrintWriter printWriter=response.getWriter();
printWriter.write("编号"+book.getId()+"<br/>");
printWriter.write("名称"+book.getName()+"<br/>");
printWriter.write("作者"+book.getAuthor()+"<br/>"); String bookHistory=makeHistory(request,id);
Cookie cookie=new Cookie("bookHistory", bookHistory);
cookie.setMaxAge(20000);
response.addCookie(cookie);
Servle第四篇(会话技术之cookie)的更多相关文章
- 会话技术( Cookie ,Session)
会话技术: 会话:浏览器访问服务器端,发送多次请求,接受多次响应.直到有一方断开连接.会话结束. 解决问题:可以使用会话技术,在一次会话的多次请求之间共享数据. ...
- JavaWeb学习之转发和重定向、会话技术:cookie、session、验证码实例、URLConnection使用(下载网页)(4)
1.转发和重定向 HttpServletResponse response 转发: RequestDispatcher dispatcher = request.getRequestDispatche ...
- 会话技术、Cookie技术与Session技术
一.会话技术 1. 存储客户端状态 会话技术是帮助服务器记住客户端状态(区分客户端)的. 2. 会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话.会话技术就是记录这 ...
- Java第三阶段学习(十三、会话技术、Cookie技术与Session技术)
一.会话技术 1. 存储客户端状态 会话技术是帮助服务器记住客户端状态(区分客户端)的. 2. 会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话.会话技术就是记录这 ...
- [转]【会话技术】Cookie技术
建立时间:6.29 & 6.30 一.会话技术简介 1.存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪 里?因为Http协议是无状态的,也就是说 ...
- 会话技术之Cookie
在无状态的客户端(未登录)下,张三想买手机然后把手机加入购物车,服务器发出添加成功的响应,然后把手机加入ServletContext域里,然后张三想在逛逛别的, 再无状态的客户端(未登录)下,李四想买 ...
- Servlet第五篇【介绍会话技术、Cookie的API、详解、应用】
什么是会话技术 基本概念: 指用户开一个浏览器,访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直到用户关闭浏览器,整个这个过程我们称为一次会话. 为什么我们要使用会话技术 ...
- JAVAWEB开发之JSP、EL、及会话技术(Cookie和Session)的使用详解
Servlet的缺点 开发人员要十分熟悉JAVA 不利于页面调试和维护(修改,重新编译) 很难利用网页设计工具进行页面设计(HTML内容导入到servlet中,用PrintWriter的对象进行输出) ...
- servlet会话技术:Cookie
什么是会话会话可以简单理解为:用户开一个浏览器访问某个网站,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话.会话过程中需要解决的一些问题每个用户在使用浏览器与服务器进 ...
随机推荐
- mysql 存储过程的实现原理
一.描述 存储过程是一组可以完成特定功能的SQL语句集,经编译后存储在数据库中 statement语句(DDL.DML.导出及管理语句等).异常处理.流程控制二.创建存储过程 系统做语句分析,如果没有 ...
- Python【每日一问】09
问:请分别写一段Python代码实现一下功能: (1)计算一个文件中的大写字母数量 (2)输入中文,返回相应的拼音,并写入文件中 答: (1)计算一个文件中的大写字母数量 file_name = &q ...
- dotnet core调试docker下生成的dump文件
最近公司预生产环境.net core应用的docker容器经常出现内存暴涨现象,有时会突然吃掉几个G,触发监控预警,造成容器重启. 分析了各种可能原因,修复了可能发生的内存泄露,经测试本地正常,但是发 ...
- Skyline TerraExplorer 7.0- 扩展信息树
Skyline TerraExplorer V7增加了一个扩展信息树的控件TEInformationWindowEx. 该控件能够将TE3DWindowEx窗口里面的对象显示为信息树的方式.TEIn ...
- 自制按钮图标的两种方法: image sprite和svg字体文件
用image sprite和svg字体文件这两种方法,都能够极大地减少小图形文件的数量, 从而减少服务器请求和带宽需求.提高网页的响应速度. 一.建立SVG字体文件 iconmoon 是一个在线工具, ...
- 基于kettle的简单HTTP接口监控
需求:监控系统中使用的所有http接口,要求简单,易用. 一般的思路也就是发送get/post请求,然后检查接口的响应结果. 如果写代码,要处理http请求,检查http响应,实现发邮件,写d ...
- QT与opencv(二)开启摄像头
OpenCV中的VideoCapture不仅可以打开视频.usb摄像头,还可以做很多事,例如读取流媒体文件,网络摄像头,图像序列等. 下面我简单介绍一个在Qt中用VideoCapture类打开笔记本电 ...
- 再论 ORM
Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射. ORM 对象关系映射,这样说还是懵. 这里比较难理解的是 关系 —— 即Relationl ,虽然看起 ...
- css实现布局
1.两栏布局 两栏布局一般就是一栏定宽一栏自适应(也就是流动).分的细的话还有左栏定宽右栏自适应.右栏定宽左栏自适应. 举个栗子:一栏定宽200px,一栏自适应. <head> <m ...
- dojo下的dom按钮与dijit/form/Button
众所周知,在dojo里存在dom和widget两个类型,dom指的是普通类型的HTML元素,包括各种类型的标签.按钮.输入框等等,而widget指的是dojo自身所带的模板,同时也包括按钮.输入框等等 ...