在web应用中打开浏览器访问一个网站,登录,浏览,到关闭浏览器,称为是一个会话。由于Http协议是无状态的,因此用户在动态页面交互信息需要一些能够保存用户信息的数据结构。这个保存用户浏览数据的数据结构有两种,一种是Cookie,保存在客户端;一种是Session,保存在服务器端。Session可以在浏览器最后一次访问之后保存30分钟,当然这个值也是可以在web.xml文件中配置的,Session的销毁一方面可以是30分钟内没有再次访问,另一方面可以是手动的销毁。30分钟无访问就将Session销毁时由于Session存在于服务器端,会占用服务器的资源,因此超时销毁是很必要的。

保存在客户端的Cookie可以设置有效期,在有效期内浏览器携带响应路径下的Cookie访问服务器,服务器就可以获取用户之前的访问信息了。Session本质上是基于Cookie的,由于当服务器为浏览器创建Session之后会为每一个Session设置一个唯一的ID,用于区分不同访问者。这个SessionID就通过Cookie的形式发送给浏览器,之后每次浏览器访问服务器指定路径的资源的时候就会带着这个Cookie,服务器根据Cookie总的ID找到先前创建的Session,然后从Session中获取数据。

但是这个向浏览器写数据的Cookie是没有设置有效期的,一旦当前浏览器关闭,那么再次打开浏览器访问之前的网站,由于Cookie失效了,服务器端的Session即使是生命周期还没结束也是无法获取和使用的。

解决办法是自己生成一个Cookie将Session的ID写入,然后将写入了SessionID的且设置了有效期的Cookie写回给浏览器

创建:

 public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 浏览器访问的时候使用getSession()为其创建SessionHttpSession session = request.getSession();String sessionID = session.getId();// Session的ID名称为JSESSIONID,可以通过HTTPWatch查看Cookie cookie = new Cookie("JSESSIONID", sessionID);cookie.setPath("/curpath");  // 设置cookie的路径cookie.setMaxAge(30 * 60); // 设置的有效时间长度是session的存在时间 半个小时response.addCookie(cookie);session.setAttribute("mydata", "hello world");}

获取:

 public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {HttpSession session = request.getSession(false); // 只获取不创建String data = null;if(session != null) // 判断是否获取了Sessiondata = (String) session.getAttribute("mydata");
<span style="white-space:pre">      </span>// Servlet中解决乱码response.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");PrintWriter pwriter = response.getWriter();pwriter.write("获取的数据是: " + data);}

另外一种无法使用已经存在的Session的情形是用户浏览器将Cookie禁止了,那么Session的ID自然是无法发送给浏览器,进而也就没办法继续使用Session了。

解决这种问题可以采用URL重写的方式,每次点击链接的时候浏览器都会讲Session的ID发送给服务器,服务器就取用相应的Session并获取信息。但是在重写URL之前一定要先获取Session。

 public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");PrintWriter pwriter = response.getWriter();
<span style="white-space:pre">      </span>// 在进行URL重写的时候必须先创建Sessionrequest.getSession(); // 然后重写URL,将Session的ID以URL的形式传递给服务器// 以解决用户浏览器禁止Cookie导致的Session无法获取的问题String url1 = response.encodeURL("/curpath/servlet/SessionDemo01");String url2 = response.encodeURL("/curpath/servlet/SessionDemo02");pwriter.write("<a href = '" + url1 + "'>发送</a><br/>");pwriter.write("<a href = '" + url2 + "'>接收</a><br/>");}

当然两种方法是可以一起使用的,getSession()方法会依次对从Cookie和URL中获取SessionID,而且如果Cookie没有被禁用,那么就不会再将SessionID追加到URL上。

两篇深入讲解Session原理的博文:

http://ywj-316.iteye.com/blog/722941

http://www.cnblogs.com/wangtao_20/archive/2011/02/16/1955659.html

【javaweb】Session原理以及浏览器禁止Cookie之后服务器如何获取Session相关推荐

  1. 浏览器的cookie和服务器存储的session有什么关联,下面妙文为你解答

    首先session是存储在服务器端,cookie是存储在客户端的,所以安全来讲session的安全性要比cookie高,然后我们获取session里的信息是通过存放在会话cookie里的session ...

  2. 关于PHP中浏览器禁止Cookie后,Session能使用吗?

    sessionid是存储在cookie中的,解决方案如下: Session URL重写,保证在客户端禁用或不支持COOKIE时,仍然可以使用Session session机制.session机制是一种 ...

  3. 远程服务器器获取session 信息失败,该如何应对

    以前学习的时候时WAMP 下面跑代码,大家都知道wamp 下面可以修改php.ini 文件中的 session 信息如下,修改完成重启wamp 环境就行了. session.save_path G:/ ...

  4. servlert生成session传到jsp,servlert从jsp页面获取session的值

    今天更是进一步理解了对象的含义.是的,楼主是条单身狗.但是我还是更深一步的理解了面向对象中对象的含义呀(呸,卖什么萌......). 首先做个简单的例子,jsp页面偏爱于el标签.el标签真的很舒服的 ...

  5. 禁止COOKIE后对SESSION的影响

    一.理解SESSION机制 简单来说:每一个SESSION都有一个唯一的session_id , 默认情况下,session_id存储在客户端(默认COOKIE['PHPSESSID']), 在使用S ...

  6. Cookie和Session的作用,区别和各自的应用范围,Session工作原理

    Cookie和Session的作用与区别 Session用于保存每个用户的专用信息. 每个客户端用户访问时,服务器都为每个用户分配一个唯一的会话ID(Session ID) . 她的生存期是用户持续请 ...

  7. cookie和session原理

    session   session_start() 开启session机制,告诉php我想使用session了 列:     $_SESSION['age']='18';     $_SESSION[ ...

  8. 浏览器禁用cookie后session还能用吗?cookie与session区别

    答:浏览器禁用cookie后session不能正常使用. cookie是一种客户端的会话技术,它是服务器存放在浏览器的一小份数据,浏览器以后每次访问该服务器的时候都会将这小份数据携带到服务器去. se ...

  9. 状态管理之cookie使用及其限制、session会话

    # 1.什么是状态管理? 将浏览器与web服务器之间多次交互当作一个整体来处理,并且将多次交互所涉及的数据(即状态)保存下来. (cookie浏览器所涉及到的访问数据保存下来) # 2.如何进行状态管 ...

最新文章

  1. 【数学基础】校招算法工程师笔试题
  2. 百度大脑发挥AI“头雁效应” 王海峰:在AI时代共同推动社会智能化升级
  3. 升级之后的BCH将推动游戏业更上一层楼
  4. 如果把西游记倒过来看,这才是真正的社会
  5. Qt控件大小自适应电脑分辨率问题
  6. 分享3段平时很实用的微代码,高手莫喷
  7. java weblogic多数据源,039 在weblogic下部署jndi的多数据源
  8. ABAP中分页控件的定义
  9. Java学习心得——整数太大的错误
  10. eclipse 使用教程
  11. 非线性可视化(2)非线性相图
  12. 移动端H5游戏开发之(移动端尺寸基础知识)
  13. apkg格式怎么打开_pdf怎么转换成word?妙招在手,转换不愁!
  14. 主机无法复制文件到ubuntu虚拟机的解决方法
  15. python爬取B站弹幕
  16. 展讯SC8810平台虚拟机分析在QEMU中模拟运行
  17. 知识蒸馏(作者 HINTON ,JEFF DEAN)
  18. 图像识别的答题卡计分
  19. Zooming Slow-Mo: Fast and Accurate One-Stage Space-Time Video Super-Resolution | 摘要翻译 |
  20. Mysql的常见面试题 + 索引原理分析

热门文章

  1. python 空对象模式_Python 单例模式(3种方式)
  2. MFC/UDP通信函数详细解说
  3. linux vg 镜像,Linux下载_Linux系统各种版本ISO镜像下载(redhat,centos,oracle,ubuntu,openSUSE)...
  4. XXL-JOB v2.0.1 发布,分布式任务调度平台
  5. JavaScript学习笔记(七)——函数的定义与调用
  6. 《Linux From Scratch》第三部分:构建LFS系统 第八章:让LFS系统可引导 - 8.2. 创建 /etc/fstab 文件...
  7. MySQL原生密码认证
  8. 基于TestNG 与Selenium 的自动化测试设计与实施
  9. 【转载】Java JVM 运行机制及基本原理
  10. jquery压缩图片插件