web cookie and session
一、什么是会话?
打开一个浏览器,访问多个网址后,再关掉浏览器,这一整个过程就是会话。
二、cookie技术
这是客户端保存临时数据的技术,主要用于保存用户的登录信息及其它需要保存的数据,如购买与结帐两个servlet之间的需要传送的数据。原理是将得到的数据存在缓存或保存在本地硬盘,下次再次访问时,将cookie里的数据一并传送给服务器。
三、session技术
作用与cookie一样,这个是服务器端技术。服务端为每一个浏览器创建一个session对象,在需要保存数据的时候,将数据存入session, 当来自该浏览器的下一个请求来时,从对应的session里取出数据使用。
一般来说,一个浏览器启动时会有一个打开窗口,它对应一个会话session,同一个窗口内的所有选项卡共享一个session,由窗口中的超链接新打开的窗口与它的父窗口共享一个session。
注:浏览器在关掉时,表示一个会话完结,此次会话所创建的session会被清除。除此之外,在session创建后30分钟,一样会被服务器删除。
如何设置session的存活时间
1.可在web.xml文件里配置session的存活时间。
- //配置session的存活时间为10分钟
- <session-config>
- <session-timeout>10</session-timeout>
- </session-config>
2. 代码实现
- HttpSession session = request.getSession();
- session.setMaxInactiveInterval(60); //设置存活时间
- session.invalidate(); //立即销毁session
- request.getSession()在执行时,如果用户对应的浏览器没有session对象,服务器则创建一个,如果已存在已创建好的session对象,则直接取出session对象使用。
request.getSession(false)则表示如果没有已存在的session对象的时候,不会创建新的session对象,只用在只需要获取session的情况下。
由上图可知,各个用户(浏览器)在访问的时候,每次都能准确地找到自己对应的session,是因为通过cookie技术传送session ID找到的,看下图
默认的情况下,服务器回写给客户端的cookie没有设有效时间,当浏览器被关掉时,cookie也会被删掉,因此,再打开一个新的浏览器时,由于没有cookie,服务器会新建一个session。如果让浏览器在关掉的时候仍然能获取到之前的session ID,只有回写一个带时间的cookie,一般设时间为30分钟(与session存活时间一致)。
- HttpSession session = request.getSession();
- String id = session.getId();
- //模仿原来的cookie
- Cookie cookie = new Cookie("JSESSIONID", id);
- cookie.setPath("/web_study");
- cookie.setMaxAge(30*60); //30 minutes
- response.addCookie(cookie);
四 怎么处理禁止了cookie的情况
session与cookie技术主要用在电子商务上,如网上商场的购买与结帐活动。如果用户在不知情的情况下禁止了cookie或在很久以前禁止了cookie而忘记打开,这样的情况用户还能正常购买吗?不可以,但是作为商场软件的开发肯定希望解决这一问题,让用户在不知情的情况下仍能正常进行购买活动。
解决的原理就是,如cookie被禁止,则通过参数的形式将购买产生的数据传递给结帐页面。
先看一个普通的示例
- //首页
public class Welcome extends HttpServlet {- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType("text/html;charset=utf-8");
- PrintWriter out = response.getWriter();
- out.println("<a href = '/web_study/servlet/Buy'>buy</a>");
- out.println("<a href = '/web_study/servlet/Pay1'>pay</a>");
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- this.doGet(request, response);
- }
- }
- //购买页面,这里没有显示
- public class Buy extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- HttpSession session = request.getSession();
- String id = session.getId();
- //模仿原来的cookie
- Cookie cookie = new Cookie("JSESSIONID", id);
- cookie.setPath("/web_study");
- cookie.setMaxAge(30*60); //30 minutes
- response.addCookie(cookie);
- session.setAttribute("name", "iphone 6 plus");
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- this.doGet(request, response);
- }
- }
- //支付页面
- public class Pay extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- HttpSession session = request.getSession();
- String product = (String) session.getAttribute("name");
- PrintWriter out = response.getWriter();
- out.print("the products you have bought:" + product);
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- this.doGet(request, response);
- }
- }
如果禁止了cookie后,在主页通过传递数据的方式给购买或支付页面(这里传的是jsessionid),如
- out.println("<a href = '/web_study/servlet/Buy?JSESSIONID="request.getSession().getId()+"'>buy</a>");
但是在实际操作的时候,不用这么麻烦,sun公司为我们提供了一个更好用的函数 response.encodeUrl(),API 说明如下
- encodeURL
- String encodeURL(String url)
- Encodes the specified URL by including the session ID in it, or, if encoding is not needed, returns the URL unchanged. The implementation of this method includes the logic to determine whether the session ID needs to be encoded in the URL. For example, if the browser supports cookies, or session tracking is turned off, URL encoding is unnecessary.
- For robust session tracking, all URLs emitted by a servlet should be run through this method. Otherwise, URL rewriting cannot be used with browsers which do not support cookies.
- Parameters:
- url - the url to be encoded.
- Returns:
- the encoded URL if encoding is needed; the unchanged URL otherwise.
翻译出来就是:这个函数能够智能地判断是否需要encode URL,如果浏览器支持cookie,这个函数将不起任何作用;如果浏览器不支持cookie,则将sessionid添加到URL里。
改写后的主页面
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType("text/html;charset=utf-8");
- PrintWriter out = response.getWriter();
- String buyUrl = response.encodeURL("/web_study/servlet/Buy");
- String payUrl = response.encodeURL("/web_study/servlet/Pay");
- out.println("<a href = '"+buyUrl+"'>buy</a>");
- out.println("<a href = '"+payUrl+"'>pay</a>");
- }
五 示例
1. cookie技术
下例演示的是如何保存历史访问时间
- package cn.blueto.study;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.Date;
- import javax.servlet.ServletException;
- import javax.servlet.http.Cookie;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class CookieDemo 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("你上次访问的时间:");
- Cookie cookies[] = request.getCookies();
- for(int i = 0 ; cookies != null && i < cookies.length; i++){
- if (cookies[i].getName().equals("lastAccessTime")){
- long cookiesValse = Long.parseLong(cookies[i].getValue());
- Date d = new Date(cookiesValse);
- out.print(d.toLocaleString());
- }
- }
- Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+"");
- cookie.setMaxAge(30*24*3600); // one month
//如果要删除cookie,只需要将时间设为0
//cookie.setMaxAge(0);- cookie.setPath("/web_study");
- response.addCookie(cookie);
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- this.doGet(request, response);
- }
- }
web cookie and session的更多相关文章
- go web cookie和session
cookie是存储在浏览器端,session是服务器端 cookie是有时间限制的,分会话cookie和持久cookie,如果不设置时间,那周期就是创建到浏览器关闭为止.这种是会话cookie,一般保 ...
- Java Web(三) 会话机制,Cookie和Session详解
很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...
- web框架开发-Django组件cookie与session
http协议的每一次都是无保存状态的请求,这会带来很多的不方便,比如,一刷新网页,或者进入该网页的其他页面,无法保存之前的登录状态.为了解决类似这样的问题,引入了会话跟踪 会话跟踪技术 1 什么是会话 ...
- web存储中cookie、session区别
http协议是一种无状态的协议,浏览器对服务器的每一次请求都是独立的.为了使得web能够产生一些动态信息,就需要保存”状态”,而cookie和session机制就是为了解决http协议无状态而产生.c ...
- Java Web 开发必须掌握的三个技术:Token、Cookie、Session
在Web应用中,HTTP请求是无状态的.即:用户第一次发起请求,与服务器建立连接并登录成功后,为了避免每次打开一个页面都需要登录一下,就出现了cookie,Session. Cookie Cookie ...
- Java Web(三) 会话机制,Cookie和Session详解(转载)
https://www.cnblogs.com/whgk/p/6422391.html 很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因 ...
- Java开发工程师(Web方向) - 02.Servlet技术 - 第2章.Cookie与Session
第2章--Cookie与Session Cookie与Session 浏览器输入地址--HTTP请求--Servlet--HTTP响应--浏览器接收 会话(session):打开浏览器,打开一系列页面 ...
- Java Web Application使Session永不失效(利用cookie隐藏登录)
在做 Web Application 时,因为 Web Project 有 session 自动失效的问题,所以如何让用户登录一次系统就能长时间运行三个月,就是个问题. 后来,看到 session 失 ...
- Session or Cookie?是否需要用Tomcat等Web容器的Session
Cookie是HTTP协议标准下的存储用户信息的工具,浏览器把用户信息存放到本地的文本文件中. Session是基于Cookie实现的. 2011年4月,武汉群硕面试的时候(实习生),面试官也问过这个 ...
随机推荐
- PHP文件读写操作之文件写入代码
在PHP网站开发中,存储数据通常有两种方式,一种以文本文件方式存储,比如txt文件,一种是以数据库方式存储,比如Mysql,相对于数据库存储,文件存储并没有什么优势,但是文件读写操作在基本的PHP开发 ...
- postman+newman+jenkins
1.postman: http://itfish.net/article/59864.html(网上参考资料) 1)安装(要用爬墙软件): 进入下面地址https://chrome.google.co ...
- loadrunner负载测试实例
回想起第一次做性能测试,感慨万千,故写下本文,从:设置虚拟用户,设置场景以及分析运行结果三个方面进行阐述 硬件环境:硬盘 1TG,cpu 3.40GHz,内存4G 软件环境:IE9.0,Weblogi ...
- Spring MVC入门知识总结
2.1.Spring Web MVC是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职 ...
- openldap sshkey & 用户自定义属性
http://qiita.com/T_Tsan/items/eeb0a9ae9b4cdeb80934 https://www.ossramblings.com/using-ldap-to-store- ...
- Java中的字符串常量池
ava中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new ...
- 交换两个数-c++实现
今天看了下交换数值的小程序,网上挺多的,整理了下,,因为参考较多,没一一给出链接,若原作者看到,可以留言,我会添加 // example_1_6_function_swap.cpp : 定义控制台应用 ...
- PHPDocument 代码注释规范总结
PHPDocument 代码注释规范 1. 安装phpDocumentor(不推荐命令行安装)在http://manual.phpdoc.org/下载最新版本的PhpDoc放在web服务器目录下使得通 ...
- ps 进程查看器
命令参数 a 显示所有进程 -a 显示同一终端下的所有程序 -A 显示所有进程 c 显示进程的真实名称 -N 反向选择 -e 等于"-A" e 显示环境变量 f 显示程序间的关系 ...
- 进阶篇:以IL为剑,直指async/await
接上篇:30分钟?不需要,轻松读懂IL,这篇主要从IL入手来理解async/await的工作原理. 先简单介绍下async/await,这是.net 4.5引入的语法糖,配合Task使用可以非常优雅的 ...