这里讲session和cookie放在一起写, 不是说他们之间有什么关系,仅最近一个项目中同时用到。偷懒,放一起整理下

Session:

Session的发明是为了填补HTTP协议的局限。请注意HTTP协议是通过用户发出请求,服务器作出响应的方式来工作的,这种用户端和服务器端的联系就是离散的,非连续的。HTTP协议不能提供允许服务器跟踪用户请求的功能。在服务器端完成响应用户的请求之后,服务器不能继续与该浏览器继续保持连接。从服务器这端来看,每一个请求都是独立的,因此HTTP协议被认为是无状态协议,当用户在多个主页间切换时,服务器无法知道他的身份。 Session的出现就是为了弥补这个局限。利用Session,您就可以当一个用户在多个主页间切换的时候也能保存他的信息。这样很多以前根本无法去做的事情就变得简单多了。

用户从到达某个特定的主页到离开为止的那段时间,每个用户都会单独获得一个Session。

Java Servlet定义了一个HttpSession接口,实现的Session的功能,在Servlet中使用Session的过程

(1) 使用HttpServletRequest的getSession方法得到当前存在的session,如果当前没有定义session,则创建一个新的session,还可以使用方法getSession()

(2) 写session变量。可以使用方法HttpSession.setAttribute(name,value)来向Session中存储一个信息。也可以使用HttpSession.putValue(name,value),但这个方法已经过时了。

(3)读Session变量。可以使用方法HttpSession.getAttribute(name)来读取Session中的一个变量值,如果name是一个没有定义的变量,那么返回的是null。需要注意的是,从getAttribute读出的变量类型是Object,必须使用强制类型转换,比如:

String uid = (String) session.getAttribute("uid");

也可以使用HttpSession.getValue(name),但是这个方法也已经过时了。

(4) 关闭session,当时用完session后,可以使用session.invalidate()方法关闭session。但是这并不是严格要求的。因为,Servlet引擎在一段时间之后,自动关闭seesion。

常用的session操作如下:

//向session中添加数据

request.getSession().setAttribute("warehouseout", list);

//获取session中的数据

ListeInbill=(List) request.getSession().getAttribute("warehousein");

//删除session中的数据

request.getSession().removeAttribute("warehouseout")

Cookie:

/**

* 添加新的Cookie

* @param name

* @param valueHttpServletResponse

*/

public static void setNewCookie(String name,String value,HttpServletResponse response) {

try {

Cookie cookie=new Cookie(name,value);

cookie.setMaxAge(60*60*24);//设置24小时生存期,当设置为负值时,则为浏览器进程Cookie(内存中保存),关闭浏览器就失效。response.addCookie(cookie);

} catch (RuntimeException e) {

// TODO: handle exception

}

}

/**

* 获取Cookie值

* @param name

* @param request

* @return

*/

public static String getCookieValue(String name,HttpServletRequest request) {

String value="";

try {

Cookie[] cookies=request.getCookies();

for (int i = 0; i < cookies.length; i++) {

if (cookies[i].getName().equalsIgnoreCase(name)) {

value=cookies[i].getValue();

}

}

} catch (RuntimeException e) {

// TODO: handle exception

}

return value;

}

/**

* 删除cookie中对应数值

* @param name

* @param request

* @param response

*/

public static void deleteCookies(String name,HttpServletRequest request,HttpServletResponse response) {

try {

Cookie[] cookies=request.getCookies();

for (int i = 0; i < cookies.length; i++) {

if (cookies[i].getName().equalsIgnoreCase(name)) {

cookies[i].setValue(null);

cookies[i].setMaxAge(0);//设置为0为立即删除该Cookie

response.addCookie(cookies[i]);

}

}

} catch (RuntimeException e) {

// TODO: handle exception

}

}

/**

* 增加规定cookie中的数值

* @param name

* @param value

* @param request

* @param response

*/

public static void addnewCookieValue(String name,BigDecimal value,HttpServletRequest request,HttpServletResponse response) {

try {

Cookie[] cookies=request.getCookies();

for (int i = 0; i < cookies.length; i++) {

if (cookies[i].getName().equalsIgnoreCase(name)) {

cookies[i].setValue(new BigDecimal(cookies[i].getValue().trim()).add(value).toString());

response.addCookie(cookies[i]);

}

}

} catch (RuntimeException e) {

// TODO: handle exception

}

}

/**

* 减去规定cookie中的数值

* @param name

* @param value

* @param request

* @param response

*/

public static void subCookieValue(String name,BigDecimal value, HttpServletRequest request,HttpServletResponse response) {

try {

Cookie[] cookies=request.getCookies();

for (int i = 0; i < cookies.length; i++) {

if (cookies[i].getName().equalsIgnoreCase(name)) {

cookies[i].setValue(new BigDecimal(cookies[i].getValue()).subtract(value).toString());

response.addCookie(cookies[i]);

}

}

} catch (RuntimeException e) {

// TODO: handle exception

}

}

cookie的其他操作:

cookie.setPath("/test/test2"); 设置Cookie路径,不设置的话为当前路径(对于Servlet来说为request.getContextPath() + web.xml里配置的该 Servlet的url-pattern路径部分)

删除设置路径的cookie时,应制定删除位置,不设置该路径,默认为删除当前路径Cookie

假设路径结构如下

test/test2/test345/test555/test666

a.相同键名的Cookie(值可以相同或不同)可以存在于不同的路径下。

b. 删除时,如果当前路径下没有键为"key"的Cookie,则查询全部父路径,检索到就执行删除操作(每次只能删除一个与自己最近的父路径Cookie)

必须指定与设定cookie时使用的相同路径来删除更改cookie,而且cookie的键名不论大写、小写或大小混合都要指定路径。

键名小写时,如果当前路径为/test/test2,如果找不到再向上查询/test、/test555、/test345,如果还找不到就查询/ 。(/test555/test666不查询)

键名大小写混合或大写时,不指定路径则默认删除当前路径,并且不向上查询。

c 读取Cookie时只能读取直接父路径的Cookie。

如果当前路径为/test/test2,要读取的键为"key"。当前路径读取后,还要读取/test,/test读取后,还要读取/

d.在做Java的web项目时,由于一般的Web服务器(如Tomcat或Jetty)都用Context来管理不同的Web Application,这样对于每个

Context有不同的Path,

在一个Server中有多个Web Application时要特别小心,不要设置Path为/的Cookie,容易误操作。(当然前提是域名相同)

java中cookie怎么用_java 中session和cookie的使用相关推荐

  1. session用法_面试中经常问到的:session和cookie有什么区别?

    一.什么是cookie? Cookie是服务器发给客户端的一小段文本,保存在浏览器所在客户端的内存和磁盘上.服务器可以从客户端读出这些cookie.通过cookie,服务器能拿到对应的session, ...

  2. java中组件与容器_java中的容器组件和非容器组件

    1.java使用到的图形类主要在java.awt 与javax.swing包中. 2.java.awt 与 javax.swing包的区别: ① java.awt中使用的图形类都是依赖于系统的图形库的 ...

  3. java boolean几个字节_Java中boolean类型到底占用多少个字节?

    1.时间:2017-07-03 07:37:06YuanMxy 2.问题描述:今天在复习java基础的时候发现一小问题,Java中boolean类型到底占用多少个字节? 3.问题解答: (1)什么是b ...

  4. java 基本类型的引用_Java中的基本数据类型与引用数据类型

    一.基本数据类型 byte.short.int.long(整数类型) float.double(浮点数类型) char(字符型) boolean(布尔类型 ) Java数据大多数存放在堆栈中.栈区:存 ...

  5. java对于数组的定义_Java中方法的定义与使用,以及对数组的初步了解。

    方法 方法的含义 定义: 方法就是用来完成解决某件事情或实现某个功能的办法. 方法实现的过程中,会包含很多条语句用于完成某些有意义的功能--通常是处理文本,控制输入或计算数值. 我们可以通过在程序代码 ...

  6. java string 后几位_java中String占几个位元组

    java中String占几个位元组以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! java中String占几个位元组 J ...

  7. java有没有回调函数_Java中的回调函数 - wangjianme的个人空间 - OSCHINA - 中文开源技术交流社区...

    Java代码的回调函数经常由框架或是系统定义,由程序开发人员填充. 它的最主要特点是即定义了调用的规范同时又非常的灵活. 回调函数有些类似于观察者模式,它们的区别在于:观察者模式返回的参数为Event ...

  8. java常见的报错_Java中常见的错误有哪些?

    原标题:Java中常见的错误有哪些? 1.java.lang.Error 错误.是所有错误的基类,用于标识严重的程序运行问题.这些问题通常描述一些不应被应用程序捕获的反常情况. 原因: 1.对系统所访 ...

  9. java i 线程不安全_java中的++i是线程安全的吗?

    java中的++i是线程安全的吗?为什么?怎么使它线程安全呢? 先说答案: 非线程安全 先说下为什么是非线程安全的? 从Java内存模型说起 Java内存模型规定了所有的便利都存储在主内存中,每个线程 ...

最新文章

  1. android html.fromhtml 字体加粗,Android Html设置TextView的颜色、加粗样式
  2. 『Windows Tips』Windows 自带屏幕截图的使用
  3. Handler和Message详解
  4. yabailv 运放_运放的压摆率PCB技术文章PCB联盟网 - Powered by Discuz!
  5. 异步IO实现和应用场景
  6. Moya、RxMoya基本使用
  7. sap 消耗策略999_SAP 计划策略
  8. codeforce 427 C. Checkposts(tarjan 强连通分量)
  9. SuperSet连接mysql设置
  10. Grandmaster 楼教主回忆录
  11. matlab交叉耦合,交叉耦合滤波器怎么从耦合矩阵得出频率响应
  12. 史上最全的 pom.xml 文件详解
  13. 2017第十五届中国国际科学仪器及实验室装备展览会会刊(参展商名录)
  14. 神经网络应用实例 -- python
  15. 免安装Oracleclient和PL/SQL
  16. 详解Promise使用与原理
  17. 如何确保多用户商城系统的有效性
  18. Gerrit历史记录查询
  19. 移动硬盘文件或目录损坏且无法读取怎么解决
  20. 【UE5/UE4】【UE C++】制作一个蓝图宏库用以在构造器中Spawn Actor

热门文章

  1. 非线性优化库Ceres问题记录
  2. JavaScript距离当前日期倒计时的方法(Vue项目)
  3. java fx能不能添加到swing中_java写个记事本
  4. SourceTree 教程文档(进阶知识)
  5. context:annotation-config、context:component-scan
  6. vs2010一运行就报错deven.exe assert failure 解决方法,卸载系统中.netFramework最新版本的(简体中文)...
  7. 微型计算机及原理怎么进制的,微型计算机原理及应用课件bcd码运算肥的十进制.ppt...
  8. 【广度优先搜索】一个实例+两张动图彻底理解 BFS | 思路+代码详解 | 用 DFS 自动控制我们的小游戏
  9. js 能实现监听F5页面刷新子iframe 而父页面不刷新
  10. 服务器系统咋关机呀,各种服务器系统的关机