博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
后台(14)——HttpSession
阅读量:7039 次
发布时间:2019-06-28

本文共 3508 字,大约阅读时间需要 11 分钟。




版权声明

  • 本文原创作者:
  • 作者博客地址:

在之前学习HTTP时我们说:标准HTTP协议既有优点也有缺点,优点在于极大地减轻了服务器的压力,每一次请求不会造成不必要连接占用;缺点在于繁复地建立连接和断开连接,请求会传输大量重复的信息,所以随后出现了Keep-Alive、Cookie、HttpSession在某些程度上弥补了标准HTTP的缺点。在上一篇博客我们学习了Cookie,在本篇博客中我们来一起学习HttpSession

HttpSession简介

与客户端技术Cookie技术不同,HttpSession是服务端技术。在WEB开发中,服务器可为用户的每个浏览器创建一个会话对象即HttpSession。默认情况下,一个浏览器独占一个HttpSession对象。因此,服务器程序可将用户数据存入用户浏览器对应的独占的HttpSession中,当用户使用浏览器访问当前应用下的其它程序时,其它程序也可以从该HttpSession中取出该用户的数据。


HttpSession的特点

  • HttpSession对象由服务器创建

    开发人员可调用request.getSession()得到该对象

  • 在同一个会话下多个Servlet可共享数据

    比如用户访问一个含有多个Servlet的网站,那么这些Servlet可共享一个HttpSession。比如,登录后把User存放到HttpSession后其他Servlet都可以使用该对象,并且在结算Servlet时用此对象判断用户是否登录。还记得之前的ServletContext么?对于存放在ServletContext中的数据,其它用户也有权限访问,但是存放在HttpSession中的数据其他应用是无法访问的。

  • Cookie只能存字符串但是HttpSession可以存对象

  • 服务器重启时会将HttpSession中的数据保存到服务器硬盘,并在重启完成后将这些数据恢复到内存中。但是请注意这些数据要实现序列化否则无法保存和还原。


HttpSession常用方法

  • setAttribute( ) 向HttpSession中保存数据
  • getAttribute( ) 从HttpSession中获取数据
  • removeAttribute( ) 从HttpSession中移除数据
  • getId( ) 返回HttpSession的唯一标识符
  • setMaxInactiveInterval( ) 设置session的存活时间(单位是秒),默认为30分钟
  • invalidate() 销毁HttpSession

HttpSession使用示例

请看如下代码:

/** * 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl */package cn.com;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class TestHttpSession extends HttpServlet {
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String NAME="name"; String JSESSIONID="JSESSIONID"; response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter writer = response.getWriter(); HttpSession httpSession = request.getSession(); String httpSessionID=httpSession.getId(); String name=(String) httpSession.getAttribute(NAME); Cookie[] cookies = request.getCookies(); for(int i=0;cookies!=null&&i
"+"JSESSIONID="+cookie.getValue()+""); } } if(httpSessionID!=null){ writer.println("

"+"httpSessionID="+httpSessionID+"

"); } if(name==null){ writer.println("

"+"还没有存放数据"+"

"); httpSession.setAttribute(NAME, "zxx9527"); }else{ writer.println("

"+"从HttpSession中获取到数据name="+name+"

"); } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }}

代码解析如下:

  • 为当前应用创建HttpSession,请参见代码第25行
  • 获取HttpSession的ID,请参见代码第26行
  • 获取名字为JSESSIONID的Cookie的值,请参见代码第32行
  • 将数据保存至HttpSession中,请参见代码第40行
  • 从HttpSession中取出数据,请参见代码第27行

运行后如效果如下图所示:

这里写图片描述


浅析request.getSession( )

在刚才的示例中我们只调用了一句request.getSession()就可以开始对HttpSession的操作,那么这句代码的内部到底做了哪些事情呢?

  • 1、获取名称为JSESSIONID的Cookie的值
  • 2、如果没有获取到该Cookie那么就创建一个新的HttpSession且为其分配一个唯一的SessionID并且立马为浏览器生成一个名字为JSESSIONID值为sessionID的Cookie
  • 3、如果可以获取到该Cookie,则取出该cookie的值(即HttpSession对象的SessionID),再依据此SessionID从服务器中找到与其对应的HttpSession

应对浏览器禁用Cookie的情况

通过之前的讲解我们知道:HttpSession是依赖于Cookie的,如果用户禁用了Cookie此时也就谈不上什么HttpSession了。所以,我们需要方法应对该情况的发生。

解决方案:利用response.encodeURL( )方法对网站的所有URL进行重写

  • 执行request.getSession( )
  • 对sendRedirect( )涉及到的url地址进行重写
  • 对表单的action和超链接的url进行重写

在重写URL后新的URL中就会包含JSESSIONID的值,比如JSESSIONID=30578BE1BD6600C2908607EE381BBB9B,从而将JSESSIONID携带至服务端。

你可能感兴趣的文章
解决“无法在windows资源管理器中打开ftp站点”问题
查看>>
服务器架构系统软件简单分类
查看>>
我的友情链接
查看>>
完全备份、差异备份以及增量备份的区别
查看>>
关于unix、dos文件格式^M处理方法整理
查看>>
2.2Python数据处理篇之---math模块的数学函数
查看>>
Data Augmentation
查看>>
C#.NET 剪切板复制粘贴泛型的例子代码参考 Clipboard Copy Paste List
查看>>
我的友情链接
查看>>
JAVA经典面试题集锦(转)
查看>>
rsync+inotify应用案例
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
nginx 访问日志分析
查看>>
RabbitMQ之消息确认机制(事务+Confirm)
查看>>
给出一个数组,计算数组中少了哪个数据的实现
查看>>
USB-232卡 配置
查看>>
C#窗体程序皮肤设置
查看>>
T-SQL.字符串函数
查看>>
mysql慢查询
查看>>