开启 J2EE(五)— Servlet之状态管理

HTTP无状态协议

首先我们要知道:

HTTP协议是无状态协议。

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

所谓无状态也就是完成一个过程后(客户端和服务器
就断开了),下一个过程如果需要前面的信息,它还需要重新进行一次,服务器不能记住上次的请求。

这样可能就是在频繁进行相同的请求传送时,数据量增大,效率降低。所以,如果在服务器不需要先前信息时它的应答就较快。

那么,如何让服务器知道不同的请求是否来自同一个客户端,就状态管理问题出现了Cookie和Session。

Cookie

Cookie保存在客户端,有两种实现方式。

方式一

 将Cookie保存到浏览器内存中

 1
保存Cookie。写到客户端(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的生命期,然后在写到客户端,就可以生成文本文件了。

 如下例,拿到客户端IP的例子:

 1
保存Cookie。写到客户端文本文件

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机制采用的是在客户端保持状态的方案。它是在客户端的会话状态的存储机制,他需要用户打开客户端的cookie支持。

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

Session

Session保存在服务端。

由于Session的是将会话保存在服务端,关闭浏览器(或新开)就没了。但是这么多的用户Session,如何区分?这就需要一个SessionID,每一个SessionID都指向了唯一的一个用户会话。但是客户端如何知道SessionID呢,方式有两种。

方式一

在Cookie中保存SessionID

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>");
	}
}

不论客户端是否禁用Cookie。如果想安全使用Session,只能使用URL重写,但相应的会增加编程负担,所以有时网站要求客户端打开Cookie。

总结

  

  相比Cookie,Session其实在之前ASP.net中已经用的很多了,当时真是觉得真好用,把值放到Session中,什么时候用直接取,不用再查数据库了,太方便了,以至于快到了滥用的趋势,然而过度使用session将会导致代码不可读而且不好维护,并且Session的默认失效期是30分钟,如果在Session中放入了大的对象,服务器的压力可想而知。所以Session的使用也需要有度。

开启 J2EE(五)— Servlet之状态管理

时间: 2024-08-17 11:43:41

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

J2EE(五)——servlet初识

一.Tomcat的三个功能: 1.jsp容器 2.Servlet容器 3.Web服务器 二.手动开发第一个servlet 开发servlet三种方式: 1.实现servlet接口 2.继承GenericServlet 3.继承HttpServlet 1.在tomcat的web apps下新建一个文件夹(myWeb),这个项目里面增加含web.xml的 WEB-INF并在WEB-INF下增加classes以及lib.在classes下编写MyFirstServlet.java: package m

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

这次实验内容是对ASP.NET配置系统的了解和使用,还有就是对Application.Session.ViewState对象的应用.首先,我想说ASP.NET配置系统真的大大超乎我的想象,我以为会是上学期JSP那样,在xml或者一些配置文件里面手动输入一些需要的变量属性.但是结果并不是,而是可以通过可视化的界面,通过非常友好的方式进行变量的添加和赋值,非常非常的方便.只要输入想要设置的变量名字,值.再刷新一下web.config文件,就会发现里面已经帮我们写好了我们想要的变量.当然,还可以把数据

开启 J2EE(六)— Servlet之Filter详解及乱码处理实例

定义和功能 Filter:过滤器,它能够在request到达Servlet之前预处理request,也可以在离开Servlet时处理response,通过对request或response的处理已达到过滤功能.但是Filter只是对request和response请求进行了拦截处理,通常不产生请求或者响应. 实现的接口 我们写Servlet需要继承一个类,Filter也一样,要实现一个接口(扩展性的体现啊):javax.servlet.Filter,并实现该接口的三个方法: <span styl

saltstack(五) saltstack的state状态管理

一,YAML语法 首先先了解一下YAML,默认的SLS文件的renderer是YAML renderer.YAML是一个有很多强大特性的标记性语言.Salt使用了一个YAML的小型子集,映射非常常用的数据结构,像列表和字典.YAML renderer的工作是将YAML数据格式的结构编译成为Python数据结构给Salt使用. YAML语法有三个注意事项,具体如下: 1,使用空白字符为文件缩排表示结构,不过不能使用TAB 2,注释用#号 3,字符串平常不使用引号,如果有需要,可以使用单引号或双引号

开启 J2EE(四)—JSP及运行原理

JSP之了解 全称Java Server Pages,通过在HTML中嵌套Java代码实现动态网页. 可以从下面四个方面去认识一下JSP: 1.动态内容模板 动态的HTML,接受处理客户的请求,可以填充不同的业务逻辑. 2.使用定制的Java代码扩展HTML 本质是对标签的动态更新.JSP生成的标签代码可以是HTML也可以是XML等其它标签语言. 3.被编译成Servlet 本质是Servlet,在开发阶段JSP是一种文本的脚本的基于模板化的语言,运行时会被编译成Servlet的格式,执行的生命

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

为windows开启winrm service, 以便进行远程管理 我在项目中要用到winrm服务,在win10企业版下没有成功启动,老是报错,在win 7下成功启动,win 10 的bug真是太深了.刚好我要远程的服务器是win 7的,所以在这里也不纠缠了,下面是win 7的winrm服务启动过程. 是windows 一种方便远程管理的服务:开启winrm service,便于在日常工作中,远程管理服务器,或通过脚本,同时管理多台服务器,来提高工作效率: 1 winrm service 默认都

[原创]java WEB学习笔记28: 会话与状态管理Cookie 机制

1.会话与状态管理 1)背景 ① HTTP协议是一种无状态的协议,WEB服务器本身不能识别出哪些请求是同一个浏览器发出的 ,浏览器的每一次请求都是完全孤立的: ② 作为 web 服务器,必须能够采用一种机制来唯一地标识一个用户,同时记录该用户的状态: ③ 问题:怎么才能实现网上商店中的购物车呢:某个用户从网站的登录页面登入后,再进入购物页面购物时,负责处理购物请求的服务器程序必须知道处理上一次请求的程序所得到的用户信息. 2)会话和会话状态 ① WEB应用中的会话:指一个客户端浏览器与WEB服务

web应用程序的状态管理

一.Web应用程序状态形式1.表单隐藏字段2.cookie——把用户状态信息通过服务器发送到客户端浏览器中保存3.Session会话跟踪,服务器为客户端创建并维护的用于存放客户状态数据的session对象4.URL地址重写.(一)cookie 1:Cookie原理: 服务器在响应请求时将一些数据以“键-值”对的形式通过响应信息保存在客户端,当浏览器再次访问相同的应用时,会将原先的Cookie通过请求信息带到服务器端. Cookie cookie = new Cookie("cool",

开启 J2EE(七)— Model1、Model2和三层架构的演变

Model1和Model2是Javaweb开发的两种常见的模型,Model1是jsp+javabean的模式,Model2是jsp+servlet+javabean的模式.JavaBean就是将逻辑处理.数据库访问等等,在java中对对象进行的打包(对应下文图中的业务逻辑). 下面就详细的认识认识: 一.Model1 在Model1模型中,是以JSP为中心,这种模型中JSP既要做页面显示,又要结合业务逻辑处理服务端过程,简单说就是Model1开发没有Servlet,JSP中既有HTML代码又有逻