后台(14)——HttpSession-阿里云开发者社区

开发者社区> 人工智能> 正文
登录阅读全文

后台(14)——HttpSession

简介: 探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分...

探索Android软键盘的疑难杂症
深入探讨Android异步精髓Handler
详解Android主流框架不可或缺的基石
站在源码的肩膀上全解Scroller工作机制


Android多分辨率适配框架(1)— 核心基础
Android多分辨率适配框架(2)— 原理剖析
Android多分辨率适配框架(3)— 使用指南


自定义View系列教程00–推翻自己和过往,重学自定义View
自定义View系列教程01–常用工具介绍
自定义View系列教程02–onMeasure源码详尽分析
自定义View系列教程03–onLayout源码详尽分析
自定义View系列教程04–Draw源码分析及其实践
自定义View系列教程05–示例分析
自定义View系列教程06–详解View的Touch事件处理
自定义View系列教程07–详解ViewGroup分发Touch事件
自定义View系列教程08–滑动冲突的产生及其处理


版权声明


在之前学习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<cookies.length;i++){
            Cookie cookie=cookies[i];
            if (JSESSIONID.equals(cookie.getName())) {
                writer.println("<h4>"+"JSESSIONID="+cookie.getValue()+"</h4>");
            }
        }
        if(httpSessionID!=null){
            writer.println("<h4>"+"httpSessionID="+httpSessionID+"</h4>");
        }
        if(name==null){
            writer.println("<h4>"+"还没有存放数据"+"</h4>");
            httpSession.setAttribute(NAME, "zxx9527");
        }else{
            writer.println("<h4>"+"从HttpSession中获取到数据name="+name+"</h4>");
        }
    }

    @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携带至服务端。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: