HTTP无状态协议

首先我们要知道:

HTTP协议是无状态协议。

我们知道HTTP协议就是server通过Request从浏览器接收和Response向浏览器输出的这么一个过程(浏览器和server的交互过程)。

所谓无状态也就是完毕一个过程后(client和server
就断开了),下一个过程假设须要前面的信息,它还须要又一次进行一次,server不能记住上次的请求。

这样可能就是在频繁进行同样的请求传送时,数据量增大,效率减少。所以,假设在server不须要先前信息时它的应答就较快。

那么,怎样让server知道不同的请求是否来自同一个client。就状态管理问题出现了Cookie和Session。

Cookie

Cookie保存在client,有两种实现方式。

方式一

 将Cookie保存到浏览器内存中

 1
保存Cookie。

写到client(addCookie())

public class SetCookie extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { Cookie c1 = new Cookie("password","123");
response.addCookie(c1);
}
}

 Cookie以键值对的形式进行保存。

 2
读取Cookie(通过Http协议传过去的)

public class ShowCookie extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { Cookie[] Cookies = request.getCookies();
for(int i=0; i<Cookies[i];i++){
Cookie c = Cookies[i];
reponse.getWriter().Println(c.getName() + "," + c.getValue());
}
}
}

此方式,Cookie仅仅能在当前浏览器窗体和子窗体中有效。重开浏览器无效。所以有一定的限制。

方式二

 将Cookie保存到文本文件

 文件怎样生成的,通过限制Cookie的生命期。然后在写到client,就能够生成文本文件了。

 例如以下例。拿到clientIP的样例:

 1
保存Cookie。写到client文本文件

public class SetCookie extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { <span style="font-family:SimSun;"> //<span lang="zh-CN" style="font-family:SimSun;">获取</span><span lang="en-US" style="font-family:Calibri;">IP</span><span lang="zh-CN" style="font-family:SimSun;">地址</span></span>
Cookie c2 = new Cookie("client_ip",request.getRemoteAddr()); //设置Cookie的生命周期为1小时,单位秒
c2.setMaxAge(60*60);
response.addCookie(c2); response.getWriter().println("SetCookie OK");
}
}

   2 读取Cookie。同方式一,略。

Cookie说明:

上面两种方式都是通过Servlet创建一个 Cookie对象,存储键-值对。

1、通过 response的 addCookie方法将该 Cookie信息加入到对应信息中。

2、再通过request.getCookies()方法获取到Cookie信息。

3、总的来说cookie机制採用的是在client保持状态的方案。

它是在client的会话状态的存储机制,他须要用户打开client的cookie支持。

4、不足:因为Cookie是保存在client的,相对存在较大的安全隐患。且一般浏览器对 Cookie的数目及数据大小有严格的限制。所以对一些小数量,安全性的信息,普通情况下通过Session存储。

Session

Session保存在服务端。

因为Session的是将会话保存在服务端。关闭浏览器(或新开)就没了。可是这么多的用户Session,怎样区分?这就须要一个SessionID。每个SessionID都指向了唯一的一个用户会话。

可是client怎样知道SessionID呢,方式有两种。

方式一

在Cookie中保存SessionID

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWtremhqag==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {     //获得 HttpSession对象
    HttpSession session = request.getSession();
    //设置 Session对象的最长不活动间隔
    session.setMaxInactiveInterval(30);     //获取 Session中的数据
    List list = (List)session.getAttribute("list");
    if (list == null) {
        list = new ArrayList();
        list.add("hey");
        //向 Session中加入数据
        session.setAttribute("list", list);
    }
}

方式二

假设禁用了Cookie?通过URL重写,SessionId能够保存在URL后面

URL重写:

public class UrlRewriterSession extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { HttpSession session = request.getSession(true);
response.getWriter().println("<a href= '" + response.encodeURL(request.getRequestURL().toString()) + "'>UrlRewrite</a>");
}
}

不论client是否禁用Cookie。

假设想安全使用Session。仅仅能使用URL重写,但对应的会添加编程负担,所以有时站点要求client打开Cookie。

总结

  

  相比Cookie,Session事实上在之前ASP.net中已经用的非常多了。当时真是认为真好用。把值放到Session中。什么时候用直接取,不用再查数据库了,太方便了,以至于快到了滥用的趋势。然而过度使用session将会导致代码不可读并且不好维护,并且Session的默认失效期是30分钟。假设在Session中放入了大的对象,server的压力可想而知。

所以Session的使用也须要有度。

开启 J2EE(五)— Servlet之状态管理的更多相关文章

  1. 五、vue状态管理模式vuex

    一.vuex介绍 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 即data中属性同时有一 ...

  2. 实验五 ASP.NET状态管理和应用程序配置 总结

    这次实验内容是对ASP.NET配置系统的了解和使用,还有就是对Application.Session.ViewState对象的应用.首先,我想说ASP.NET配置系统真的大大超乎我的想象,我以为会是上 ...

  3. Vue之状态管理(vuex)与接口调用

    Vue之状态管理(vuex)与接口调用 一,介绍与需求 1.1,介绍 1,状态管理(vuex) Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态 ...

  4. Servlet学习笔记06——什么是转发,路径,状态管理?

    1.include指令 (1)作用: 告诉容器,在将jsp转换成Servlet时,将 某个文件的内容插入到该指令所在的位置. (2)语法: <%@ include file="&quo ...

  5. saltstack(五) saltstack的state状态管理

    一,YAML语法 首先先了解一下YAML,默认的SLS文件的renderer是YAML renderer.YAML是一个有很多强大特性的标记性语言.Salt使用了一个YAML的小型子集,映射非常常用的 ...

  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理

    状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容,今天我们来讲讲状态管理. 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实 ...

  7. 为windows开启winrm service, 以便进行远程管理

    为windows开启winrm service, 以便进行远程管理   是windows 一种方便远程管理的服务:开启winrm service,便于在日常工作中,远程管理服务器,或通过脚本,同时管理 ...

  8. Flink状态管理与状态一致性(长文)

    目录 一.前言 二.状态类型 2.1.Keyed State 2.2.Operator State 三.状态横向扩展 四.检查点机制 4.1.开启检查点 (checkpoint) 4.2.保存点机制 ...

  9. [译]面向初学者的Asp.Net状态管理技术

    介绍 本文主要讲解Asp.Net应用程序中的状态管理技术(Asp.Net中有多种状态管理技术),并批判性地分析所有状态管理技术的优缺点. 背景 HTTP是无状态的协议.客户端发起一个请求,服务器响应完 ...

随机推荐

  1. Python 35 进程间的通信(IPC机制)、生产者消费者模型

    一:进程间的通信(IPC):先进先出  管道:队列=管道+锁 from multiprocessing import Queue q=Queue(4) q.put(['first',],block=T ...

  2. CALayer(一)

    CALayer CALayer和UIView CALayer和UIView相比--CALayer少了事件处理的功能,所以更加轻量级,性能更好一点,这就说明如果有一些和用户交互的东西是不建议用CALay ...

  3. Android java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader......couldn't find "libweibosdkcore.so

    java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/ ...

  4. Android_传感器光学

    上一篇写了一个小案例方向传感器,与这光学传感器原理大致类似,但其实代码的主要区别得到的类型不一样在这里我一一列举出来: * Sensor.TYPE_ORIENTATION:方向传感器. * Senso ...

  5. 远程连接Oracle设置

    1:打开net manager:开始->程序->oracle->配置和移植工具->Net Manager 2:添加服务器名->名子自定义,一般根据项目自定义,自己知道就行 ...

  6. SQL server高级语法

    1. 公共表达式CTE 公用表表达式 (CTE) 具有一个重要的优点,那就是能够引用其自身,从而创建递归 CTE.递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达 ...

  7. JNDI连接池连接Oracle数据库

    今天做了一个评论的小功能,要求用JNDI连接池连接Oracle数据库,以前只是测试了是否连接的上,现在没想到一个JNDI连接池连接Oracle数据库,纠结了好久,原来都是Oracle数据库的问题,这是 ...

  8. Hadoop多节点Cluster

    Hadoop多节点集群规划 服务起名称 内网IP HDFS YARN master 192.168.1.155 NameNode ResourceManager slave1 192.168.1.11 ...

  9. 使用OpenCV画折线图

    使用OpenCV画直方图是一件轻松的事情,画折线图就没有那么Easy了,还是使用一个库吧: GraphUtils 源代码添加入工程 原文链接:http://www.360doc.com/content ...

  10. 《3D建模初步》参考资料

    本门课程主要从3D打印角度来介绍3D建模的简单知识.课程采用免费的3D CAD软件Autodesk 123D Design来具体演示一些简单模型的构建方法,并介绍3D打印有关的知识与方法. 课程以&l ...