客户端与服务器通信过程中,会产生一些数据。比如,A和B分别登陆了某宝购物网站,A买了一个Android手机,B买了一个iPhone手机,当结账时,web服务器需要分别对用户A和B的信息分别保存。根据Java Web之Servlet技术中所说,HttpServletRequest对象和ServletContext对象都可以保存数据,但是这二者在该情形下是不适合使用的。

  • 客户端的每次请求,服务器都会产生一个HttpServletRequest对象,该对象只保存本次请求所传递的数据。由于购买和结账是两个不同的请求,所以使用HttpServletRequest对象保存信息会造成丢失。
  • 同一个Web应用共享一个ServletContext对象,所以当多个用户结账时无法区分哪个商品是哪个用户购买的,这显然是不可行的。

1、Cookie对象

  Cookie是一种会话技术,它用于将会话过程中的数据保存在用户的浏览器中,从而使浏览器和服务器更好的交互。服务器向客户端发送Cookie时,会在HTTP响应头字段增加Set-Cookie字段,该字段设置的Cookie遵循一定规则,比如以键值对形式保存,Cookie属性值可以有多个,但是这些属性之间必须以分号和空格分隔。以下是一个Cookie示例:

Set-Cookie:"lastTime="2016-05-21 12:03:10"; Version=1"

Cookie使用

  为了封装Cookie信息,Servlet API中提供了一个javax.servlet.http.Cookie类,该类包含了生成Cookie信息和提取Cookie信息各个属性的方法,Cookie唯一的构造方法下:

public Cookie(java.lang.String name, java.lang.String value)

  构造方法中,name用于指定Cookie名称,value指定Cookie的值,注意,Cookie一旦创建后,其名称就不允许更改了,Cookie值是可以更改的。Cookie类常用的方法如下:

方法 功能
String getName() 返回Cookie名称
 void setValue(String newValue)/String getValue() 设置/获取Cookie值
void setMaxAge(int expiry)/int getMaxAge() 设置/获取Cookie在浏览中保存有效的秒数
void setPath(String uri)/public String getPath() 设置/获取Cookie向有效目录路径
void setDomain(String pattern)/String getDomain() 设置/获取Cookie的有效域
void setSecure(boolean flag)/boolean getSecure() 设置/获取Cookie是否只能使用安全的协议传送

Cookie示例

  利用Cookie技术实现提示上次访问时间功能。

package zzz;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date; import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @WebServlet(name="CookieTest", urlPatterns={"/CookieTest"})
public class CookieTest extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 指定响应编码方式
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter(); String lastTime = null;
Cookie[] cookies = request.getCookies();
for (int i = 0; cookies != null && i < cookies.length; i++) {
if (cookies[i].getName().equals("lastTime")) {
lastTime = cookies[i].getValue();
}
} if (lastTime == null) {
out.println("你好,这是你首次访问网站");
}
else {
out.println("你好,你上次访问该网站时间为:" + lastTime);
} // 创建cookie,将当前时间记录到cookie中并返回
String time = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
Cookie cookie = new Cookie("lastTime", time);
response.addCookie(cookie);
} @Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
this.doGet(request, response);
}
}

2、Session技术

  Cookie技术可以将用户信息保存在浏览器中,并且可在多次请求中共享数据,但是如果传递的信息比较多, 使用Cookie技术明显加大服务端程序的处理难度。此时,可以使用Session技术来实现,其通过将会话数据保存在服务端。注意:Session对象对应着一个ID,所以一般是需要客户端记录该对象的ID,通常情况下,Session是通过Cookie技术来传递Session对象ID的。

  Session对象是与每个请求紧密相关的,HttpServletRequest定义了用于获取Session对象的getSession()方法,如下所示:

public HttpSession getSession(boolean create);
public HttpSession getSession();

  第一个getSession()根据参数值决定是否创建新的Session对象,如果参数为true,则相关的HttpSession对象不存在时创建新的HttpSession对象,如果参数为false,则不会创建新的HttpSession对象。第二个getSession()方法则相当于第一个方法参数为true的情况。HttpSession常用方法如下:

方法 功能
String getId() 返回该HttpSession对象关联的会话标识号
int getMaxInactiveInterval() 返回当前HttpSession对象最大生存周期,单位为s
void invalidate() 强制使HttpSession对象失效
void setAttribute(String name, Object value) 将一个对象与一个名称关联后存储到HttpSession对象中
Object getAttribute(String name) 返回当前HttpSession对象中指定名称的属性对象
void removeAttribute(String name) 从当前HttpSession对象中删除指定名称属性对象

  Web服务器管理HttpSession对象时,会采用超时管理机制判断客户单是否还在继续访问。一定时间内,某个客户一直没有访问,Web服务器就会认为该客户端已经结束请求,将与该客户会话所关联的HttpSession对象给垃圾回收掉。如果之后该客户端再次访问,则重新创建一个新的HttpSession对象。会话的有效时间可以再web.xml中设置,默认值有Servlet容器定义,在tomcat的安装目录中的web.xml中有如下配置,就是设置Session超时时间的,单位为分钟。

<session-config>
<session-timeout>30</session-timeout>
</session-config>

Session示例

  利用Session技术实现提示上次访问时间功能。

package zzz;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date; import javax.servlet.annotation.WebServlet;
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; @WebServlet(name="SessionTest", urlPatterns={"/SessionTest"})
public class SessionTest extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 指定响应编码方式
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter(); String user = null;
Cookie[] cookies = request.getCookies();
for (int i = 0; cookies != null && i < cookies.length; i++) {
if (cookies[i].getName().equals("user")) {
user = cookies[i].getValue();
}
} HttpSession session = request.getSession();
if (user == null) {
out.println("你好,这是你首次访问网站");
Cookie cookie = new Cookie("user", "luoxn28");
response.addCookie(cookie);
}
else {
String time = (String) session.getAttribute("lastTime");
out.println("你好,你上次访问该网站时间为:" + time);
} String lastTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
session.setAttribute("lastTime", lastTime);
} @Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
this.doGet(request, response);
}
}

参考资料

  1、Java Web之Servlet技术

  2、《Java Web程序开发入门》6章

Java Web之会话技术的更多相关文章

  1. java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用)

    java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用) 这是我关于会话技术的第二篇文章,对 Cookie有不了解的兄弟可以点击下方的Cookie跳转 Cookie链 ...

  2. Java Web之JSP技术

    JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比htm ...

  3. Java Web(三) 会话机制,Cookie和Session详解(转载)

    https://www.cnblogs.com/whgk/p/6422391.html 很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因 ...

  4. Java Web之Servlet技术

    1.Servlet基础 针对Servlet技术开发,Sun公司提供了一些列接口和类,其中最重要的是javax.servlet.Servlet接口,两个重要的包是javax.servlet和javax. ...

  5. 第一章 Java Web应用开发技术

    Java Web应用开发是基于JavaEE(JavaEnterprise Edition)框架的,而JavaEE是建立在Java平台上的企业级应用解决方案.JavaEES框架提供的Web开发技术主要支 ...

  6. Java web应用开发技术

    Java web应用程序供用户通过浏览器发送请求,程序通过执行产生web页面,并将页面传递给客户机器上的浏览器,将得到的web页面呈现给用户. 一个完整的Java web应用程序通常由许多组件构成的, ...

  7. JAVA基础之会话技术-Cookie及Session

    至此,学习Servlet三个域对象:ServletContext(web项目).request(一次请求).Session(一个客户端)!均有相同的方法! 从用户开始打开浏览器进行操作,便开始了一次会 ...

  8. JAVA Web 实现会话跟踪的技术笔记

    1.HTTP协议无状态:客户端的请求与服务器的响应所发生的一系列行为简单的说是客户发送了请求,服务器就给客户端响应,它们彼此之间都没有记录下来.如: 顾客与自动售货机 普通顾客(非会员)与商场 2.c ...

  9. Java Web(三) 会话机制,Cookie和Session详解

    很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...

随机推荐

  1. GifShot - 创建动态 GIF 的 JavaScript 库

    GifShot 是一个可以创建流媒体,视频或图像的 GIF 动画的 JavaScript 库.该库的客户端特性使其非常便携,易于集成到几乎任何网站.利用最先进的浏览器 API ,包括 WebRTC , ...

  2. 图标集锦:10套免费的社交媒体 & 社交网站图标

    社交网络是最近几年互联网领域最热门的关键词之一,如今社会网络化媒体也成为我们信息获取和传播的重要途径,很多网站都有把内容分享到社交媒体的功能. 社交媒体图标作为向用户传递信息的重要媒介,不管是在网页还 ...

  3. swift学习笔记之-属性

    //属性 import UIKit //属性(Properties)详解 /* 存储属性(Stored Properties):类.结构体中,不能在枚举中 计算属性(Computed Properti ...

  4. js编写当天简单日历

    之前一直很想用javascript写一个日历,但是因为完全没有好的思路, 所以迟迟没有尝试.最近在网上刚好看到用javascript编写的简单日历的例子,代码量虽然不大, 但是我觉得很好地阐述了js日 ...

  5. linux 压缩命令详解

    原文地址:http://www.2cto.com/os/201112/114982.html 编写shell脚本的时候经常需要解压缩到指定的文件夹,tar命令是最常用的 参考一下说明,其中注意-C的用 ...

  6. VMware: XXX is still busy. Please wait until the operation is complete before closing

      在使用vmware的过程中发现创建快照.恢复快照.管理快照等功能突然都变成灰色的,用不了.更觉得夸张的是仅仅剩下关闭虚机按钮是红色的.心想估计是虚机快照没处理完之类的问题导致的,于是想想关闭虚机重 ...

  7. entityframework lamda 使用where时的注意事项

    我在项目中做了个底层 访问数据库泛型类 BaseEFDao<T> 在获取实体模型的时候使用了 Entities.CreateObjectSet<T>().Where(Func& ...

  8. [Android L]SEAndroid增强Androd安全性背景概要及带来的影响

    1  SEAndroid背景   Android对于操作系统安全性方面的增强一直沿用Linux内核所提供的MAC强制访问控制套件SELinux,对权限进行了更为深度的管理,有效地控制着进程对资源的访问 ...

  9. Android中的跨进程调用技术AIDL

    什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用 ...

  10. 最新中国菜刀caidao-20160620下载和说明

    0x00 中国制造, 黑客之刀 中国菜刀是中国安全圈内使用非常广泛的一款Webshell管理工具,此次老兵大牛进行了更新,界面更加优美,功能更加丰富,有图有真相! 0x01 验证 此次更新还自带了官网 ...