码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-06-27 10:19:12      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:servlet   cookie   session   

HTTP无状态协议


首先我们要知道:

HTTP协议是无状态协议。

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

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

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

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


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

bubuko.com,布布扣


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之状态管理,布布扣,bubuko.com

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

标签:servlet   cookie   session   

原文地址:http://blog.csdn.net/akkzhjj/article/details/34922351

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!