javaEE(5)_Cookie和Session
一、会话
1、什么是会话?
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话.类似打电话一样.
2、会话过程中要解决的一些问题?
每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,服务器要想办法为每个用户保存这些数据.
例如:多个用户点击超链接通过一个servlet各自购买了一个商品,服务器应该想办法把每一个用户购买的商品保存在各自的地方,以便于这些用户点结帐servlet时,结帐servlet可以得到用户各自购买的商品为用户结帐.
提问:这些数据保存在request或servletContext中行不行?
二、保存会话数据的两种技术
1、Cookie
Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去.这样,web资源处理的就是用户各自的数据了.
2、Session
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务.
三、Cookie
1、Cookie API
javax.servlet.http.Cookie类用于创建一个Cookie,response接口也中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段. 同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie.Cookie类的方法:
Cookie(String name,String value) //唯一的构造方法,cookie中只能存字符串
setValue与getValue方法
setMaxAge与getMaxAge方法 //设置cookie的有效时间,秒为单位
setPath与getPath方法 //设置cookie的有效路径,在该路径下访问会带cookie
setDomain与getDomain方法 //第三方cooie,不使用
getName方法
2、Cookie应用
1>显示用户上次访问时间
public class ServletTest extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//注意:resp写的时候是先写给自己,所以相当于可以组装后再输出
//先读取到当前cookie
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("上次访问时间:"); Cookie cookies[]=request.getCookies();
for(int i=0;cookies!=null && i<cookies.length;i++){
if(cookies[i].getName().equals("lastAccessTime")){
long cookieValue=Long.parseLong(cookies[i].getValue());
Date date=new Date(cookieValue);
out.print(date.toLocaleString());
}
}
//cookie中只能存字符串
//再将最新的时间返回给客户端
Cookie cookie=new Cookie("lastAccessTime",System.currentTimeMillis()+"");
cookie.setMaxAge(3600);// 以秒为单位
cookie.setPath("/CNMServlet");//默认是个cookie只能由创建它的web应用获得
response.addCookie(cookie);
}
}
2>通过setMaxAge置为0来删除当前Cookie
public class CookieTest extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//cookie的value可以随意设置
Cookie cookie=new Cookie("lastAccessTime",System.currentTimeMillis()+"");
//setMaxAge如果不设置,那么保存时间和Session效果一样,浏览器进程关闭时消失,也就是会话级别.
cookie.setMaxAge(0);// 以秒为单位
cookie.setPath("/CNMServlet");//路径也要一样才能删除
resp.addCookie(cookie);
}
}
3、Cookie细节
1.一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE).
2.一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie.
3.浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB.
4.如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除.若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间.将最大时效设为0则是命令浏览器删除该cookie.只限于同一种浏览器,各种浏览器管理各自的cookie.
5.注意,删除cookie时,path必须一致,否则不会删除.
4、cookie的经典案例:电商网站显示用户上次浏览过的商品
//首页显示最近浏览的商品
public class CookieDemo3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//输出所有商品
out.write("本站有如下商品:<br/>");
Map<String,Book>map=Db.getAll();
for(Map.Entry<String, Book> entry:map.entrySet()){
Book book=entry.getValue();
out.print("<a target=\"_blank\" href='/day07/servlet/cookieDemo4?id="
+book.getId()+"'>"+book.getName()+"</a><br/>");
}
//显示用户看过的商品
out.print("<br/>你曾经看过的商品<br/>");
Cookie cookies[]=request.getCookies();
for(int i=0;cookies!=null && i<cookies.length;i++){
if(cookies[i].getName().equals("bookHistory")){
//全部+//转义,这样不用判断符号在正则中是否已经转义
String ids[]=cookies[i].getValue().split("\\,");//2,3,1
for(String id:ids){
Book book=(Book) Db.getAll().get(id);//这里进行了检索
out.print("<a target=\"_blank\" href='/day07/servlet/cookieDemo4?id="
+book.getId()+"'>"+book.getName()+"</a><br/>");
}
}
}
}
}
//模拟数据库,因为有序且要检索,所以采用LinkedHashMap
class Db{
private static Map<String,Book> map=new LinkedHashMap<String,Book>();
static {
map.put("1", new Book("1","JavaWeb开发","老k","一本好书"));
map.put("2", new Book("2","jdbc开发","老张","一本好书"));
map.put("3", new Book("3","spring开发","老li","一本好书"));
map.put("4", new Book("4","struts开发","老张","一本好书"));
map.put("5", new Book("5","android开发","老bi","一本好书"));
}
public static Map getAll(){
return map;
}
} class Book{
private String id;
private String name;
private String author;
private String description;
}
//商品详情页,在这里添加商品到Cookie
public class CookieDemo4 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//根据用户带过来的id,显示相应的详细信息
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String id=request.getParameter("id");
Book book=(Book)Db.getAll().get(id);
out.write(book.getId()+"<br/>");
out.write(book.getName()+"<br/>");
out.write(book.getAuthor()+"<br/>");
out.write(book.getDescription()+"<br/>");
//2.构建cookie,回写给浏览器;
String cookieValue=buildCookie(id,request);
Cookie cookie=new Cookie("bookHistory",cookieValue);
cookie.setMaxAge(1*30*24*3600);//1 个月
cookie.setPath("/day07");
response.addCookie(cookie);
} private String buildCookie(String id, HttpServletRequest request) {
//可能出现的4种情况
//bookHistory =null 1 1
//bookHistory=2,5,1 1 1,2,5
//bookHistory=2,5,4 1 1,2,5
//bookHistroy=2,5 1 1,2,5 // 假如列表最多3个
String bookHistroy=null;
Cookie cookies[]=request.getCookies();
for(int i=0;cookies!=null && i<cookies.length;i++){
if(cookies[i].getName().equals("bookHistory")){
bookHistroy=cookies[i].getValue();
}
}
if(bookHistroy==null)
return id;
//if(bookHistroy.contains(id))不能这样 21,23 也包括1
List<String> list=Arrays.asList(bookHistroy.split("\\,"));
LinkedList <String>linkedlist=new LinkedList<String>(list);
if(list.contains(id)){
linkedlist.remove(id);
linkedlist.addFirst(id);
}else{
if(list.size()>=3){
linkedlist.removeLast();
linkedlist.addFirst(id);
}else
linkedlist.addFirst(id);
}
StringBuffer sb=new StringBuffer();
for(String bid : linkedlist){
sb.append(bid+",");
}
return sb.deleteCharAt(sb.length()-1).toString();
}
}
ps:Cookie可以使用在最近浏览商品、购物车可以存在Cookie中、最近登录时间、多长时间自动登录、等.
四、Session
1、在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务.
2、Session和Cookie的主要区别在于:Cookie是把用户的数据写给用户的浏览器.Session技术把用户的数据写到用户独占的session中.
3、Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象.
4、最简单session实现一个购物
//用户买了一个洗衣机
public class SessionDemo1 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp){
//如果有session则拿到,没有则创建
HttpSession session=req.getSession();
session.setAttribute("name", "洗衣机");
//session.setMaxInactiveInterval(3600);//设置session的有效时间,还可以在web.xml中设置
//session.invalidate();//手动摧毁session
} }
//再来一个请求完成结账
public class SessionDemo2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html;charset=utf-8");
//加false,只会获取不会创建,性能更好,在用户直接访问的情况下不会创建session
HttpSession session=request.getSession(false);
//HttpSession session=request.getSession();
String name=(String) session.getAttribute("name"); PrintWriter out = response.getWriter();
if(name!=null)
out.write(name);
else
out.write("no buy");
}
}
session实现原理:用户首先访问getSession方法时,创建一个session,这时服务器会通过Cookie的形式回写给客户端一个sessionId,客户端再访问服务器时,会带着这个Cookie过来,服务器根据这个ID可以找到客户端的session.这种情况下session默认的时间也就是和cookie一样,会话级别,如果想在浏览器关闭以后再次打开还能找到之前的Session,可以自己回写Cookie,设置Cookie的MaxAge,精测这种方式也只能在同种浏览器才能实现,如果在不同浏览器之间,即使设置了MaxAge也无法找到之前的Session.
5、实现多个浏览器共享同一session,也就是关闭后再打开,Session还能找到.
public class SessionDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { HttpSession session=request.getSession();
session.setAttribute("name", "aaa");
String id=session.getId();
Cookie cookie=new Cookie("JSESSIONID",id);//必须和浏览器返回的那么一样
cookie.setPath("/CNMServlet/");//这个也必须和浏览器返回的一样
cookie.setMaxAge(*);//30 minutes
response.addCookie(cookie);
}
}
6、浏览器禁用Cookie后的session处理.解决方案:URL重写.将sessionId通过URL的方式传递,略.
response. encodeRedirectURL(java.lang.String url) 用于对sendRedirect方法后的url地址进行重写.
response. encodeURL(java.lang.String url) 用于对表单action和超链接的url地址进行重写.
五、session案例
1、实现一个购物车,实际使用cookie较多.
//首页,列出所有书
public class ListBookServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("本站有如下商品<br/>");
Map<String, Book> map = Db.getAll();
for (Map.Entry<String, Book> entry : map.entrySet()) {
Book book = entry.getValue();
String str = "<a target=\"_blank\" href='"
+ request.getContextPath() + "/servlet/buyServlet?id="
+ book.getId() + "'>" + book.getName() + "购买" + "</a><br/>";
out.print(str);
}
System.out.println("a" + request.getContextPath() + "b");
}
} class Db {
private static Map<String, Book> map = new LinkedHashMap<String, Book>();
static {
map.put("", new Book("", "JavaWeb开发", "老k", "一本好书"));
map.put("", new Book("", "jdbc开发", "老张", "一本好书"));
map.put("", new Book("", "spring开发", "老li", "一本好书"));
map.put("", new Book("", "struts开发", "老张", "一本好书"));
map.put("", new Book("", "android开发", "老bi", "一本好书"));
} public static Map getAll() {
return map;
}
} class Book {
private String id;
private String name;
private String author;
private String description;
}
public class BuyServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String id=request.getParameter("id");
Book book=(Book)Db.getAll().get(id);
HttpSession session=request.getSession();
//用session中得到用户购买的商品集合
List <Book> list=(List)session.getAttribute("list");
if(list==null){
list=new LinkedList<Book>();
session.setAttribute("list", list);
}
list.add(book);
session.setAttribute("list",list);
response.sendRedirect(request.getContextPath()+"/servlet/listCartServlet");
}
}
public class ListCartServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
HttpSession session=request.getSession(false);
if(session==null){
out.write("您没有购买任何商品");return;
}
List<Book> list=(List) session.getAttribute("list");
out.write("你购买了如下商品");
for(Book book:list){
out.write(book.getName()+"<br/>");
}
}
}
2、session案例一次性校验码
一次性验证码的主要目的就是为了限制人们利用工具软件来暴力猜测密码.
服务器程序接收到表单数据后,首先判断用户是否填写了正确的验证码,只有该验证码与服务器端保存的验证码匹配时,服务器程序才开始正常的表单处理流程.密码猜测工具要逐一尝试每个密码的前题条件是先输入正确的验证码,而验证码是一次性有效的,这样基本上就阻断了密码猜测工具的自动地处理过程.
3、session案例防止表单重复提交(struts2底层实现原理)
1>js处理方式:
aaarticlea/png;base64,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" alt="" width="426" height="195" />
//访问提交表单页面时,服务器自动写入隐藏域token
public class FormServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//产生随机数(表单号)
TokenProcessor tp=TokenProcessor.getInstance();
String token=tp.generateToken();
request.getSession().setAttribute("token", token);
request.getRequestDispatcher("/form.jsp").forward(request, response);
}
} //随机数生成器
class TokenProcessor{//令牌 单例
private TokenProcessor(){}
private static final TokenProcessor instance=new TokenProcessor();
public static TokenProcessor getInstance(){
return instance;
}
public String generateToken(){
//这个拿到的数据可能长度不一致
String token=System.currentTimeMillis()+new Random().nextInt()+"";
try {
//采用Mmd5算法获取数据摘要,也就是数据指纹,任何数据的指纹长度一样
MessageDigest md=MessageDigest.getInstance("md5");
byte []md5=md.digest(token.getBytes()); //这个地方必定要查码表,且肯定是乱码
//return new String(md5); //base64编码,转换为明文字符串,键盘可见的
BASE64Encoder encoder=new BASE64Encoder();
return encoder.encode(md5); } catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
}
public class DoFormServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String r_token = request.getParameter("token");
HttpSession session = request.getSession(false);
if (r_token != null && session != null && r_token.equalsIgnoreCase(
(String) session.getAttribute("token"))) {
request.getSession().removeAttribute("token");
System.out.println("向数据库写用户名");
} else {
System.out.println("重复提交");
}
}
}
六、三个域对象,独家总结
Request |
显示完就不用了 |
session |
显示完等下还要用,用户登录,验证码,防表单重复提交 |
servletContext |
显示完等下还要用,还要给别人用,如聊天室 |
javaEE(5)_Cookie和Session的更多相关文章
- javaEE开发中使用session同步和token机制来防止并发重复提交
javaEE开发中使用session同步和token机制来防止并发重复提交 通常在普通的操作当中,我们不需要处理重复提交的,而且有很多方法来防止重复提交.比如在登陆过程中,通过使用redirect,可 ...
- [转载]JavaEE学习篇之——Session&&Cookie
原文链接: http://blog.csdn.net/jiangwei0910410003/article/details/23337043 今天继续来看看JavaWeb的相关知识,这篇文章主要来讲一 ...
- JavaEE:Cookie和Session
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去.这样web资源处理的就是用户各自的数据了. ...
- php会话控制cookie/session
设置cookie PHP设置Cookie最常用的方法就是使用setcookie函数,setcookie具有7个可选参数,我们常用到的为前5个: name( Cookie名)可以通过$_COOKIE[' ...
- cookie 与 session
cookie简介 Cookie是存储在客户端浏览器中的数据,我们通过Cookie来跟踪与存储用户数据.一般情况下,Cookie通过HTTP headers从服务端返回到客户端.多数web程序都支持Co ...
- Servlet Session的使用
Session 是服务器端会话技术.当浏览器访问 Web 服务器的资源时,服务器可以为每个用户浏览器创建一个 Session 对象,每个浏览器独占一个 Session 对象.由于每个浏览器独占一个 S ...
- Smarty模本引擎
封装一个自定义Smarty引擎 Smart模板注释 基本语法:{* 注释内容 *} Smarty模板中的变量 简单变量 四种标量类型:整型.浮点型.布尔型和字符串型! 数组变量 可以给模板分配一个数组 ...
- ThinkPHP中的视图二
ThinkPHP中的视图 1.模板注释 在实际项目开发中,经常要使用注释功能,如果是ThinkPHP框架,则可以在模板文件中使用如下方式进行注释: {// 注释内容 } :单行注释 {/* 注释内容 ...
- PHP学习笔记 - 进阶篇(6)
PHP学习笔记- 进阶篇(6) 会话控制(session与cookie) 当前的Cookie为: cookie简介 Cookie是存储在客户端浏览器中的数据,我们通过Cookie来跟踪与存储用户数据. ...
随机推荐
- Unity3D研究院之IOS Android支持中文与本地文件的读取写
前几天有个朋友问我为什么在IOS平台中可以正常的读写文件可是在Android平台中就无法正常的读写.当时因为在上班所以我没时间来帮他解决,晚上回家后我就拿起安卓手机真机调试很快就定位问题所在,原 ...
- 2014-9-9 NOIP模拟赛
东方幻想乡系列模拟赛Stage 1命题 Nettle审题 Barty ccy1991911 FlanS39 Wagner T2 高精除高精,从来没写过,不知道怎么写,我就用大数减小数ans次,果断超时 ...
- 洛谷P4717 【模板】快速沃尔什变换(FWT)
传送门 这玩意儿太骚了…… 参考了yyb巨佬的 //minamoto #include<iostream> #include<cstdio> #define ll long l ...
- Mol Cell Proteomics. |阳梦如|富马酸二甲酯在神经元和星形胶质细胞中新蛋白质靶点的鉴定及相关功能验证
大家好,本周分享的是发表在Molecular & Cellular Proteomics.上的一篇关于富马酸二甲酯在脑细胞蛋白质中新作用靶点的鉴定及功能性验证的文章,题目是Identifica ...
- UITableView以及cell属性
在ios的UI中UITableView是个常用且强大的控件 基本使用: 1>设置代理,一般把控制器设为代理:self.tableView.delegate = self; 2>遵守代理的协 ...
- BackgroundWorker的使用一二(可视化编程,开始后台工作,报告进度,取消后台工作等)
C# 提供了BackgroundWorker功能非常强大,可以将某项工作放到后台运行,可以让后台报告进度,可以取消后台工作...... BackgroundWorker的上述功能是通过 1. 三个主要 ...
- js中的同步和异步的个人理解(转)
你应该知道,javascript语言是一门“单线程”的语言,不像java语言,类继承Thread再来个thread.start就可以开辟一个线程,所以,javascript就像一条流水线,仅仅是一条流 ...
- 消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用
消息队列介绍.RabbitMQ&Redis的重点介绍与简单应用 消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下 ...
- php pack、unpack、ord 函数使用方法(二进制流接口应用实例)
在工作中,我也逐渐了解到pack,unpack,ord对于二进制字节处理的强大. 下面我逐一介绍它们.在我们工作中,用到它们的估计不多. 我在最近一个工作中,因为通讯需要用到二进制流,然后接口用php ...
- JVM-GC日志分析
程序运行时配置如下参数: -Xms20M -Xmx20M -Xmn10M -verbose:gc -XX:+PrintGCDetails -XX:SurvivorRatio= -XX:+PrintGC ...