`
剑晨java
  • 浏览: 23532 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

cookie和session

阅读更多
   cookie是客户端技术。程序把每个用户的数据以cookie形式写给用户的浏览器,浏览器可以存在缓存区或者用户的硬盘区。这样,当用户访问服务器的web资源时,就可以带着各自的数据去。我们访问某个网站时自动登录或者网站显示上次访问时间等可以通过cookie实现。
    session是服务器端技术。服务器在运行时可以为每个用户的浏览器创建一个其独享的session对象,这样,可以把用户的数据放入session中,当用户浏览器再去访问服务器中的其他web资源时,可以通过session带着各自的数据区。我们注册时验证码的校检或购物时的购物车都可以通过session实现。
     一、cookie。
     (1)cookie的创建、发送、获取和删除。
      创建:Cookie(String name, String value),cookie的构造函数,在创建cookie是传入cookie的名称和数据。setMaxAge(int expiry),设置cookie的有效时限,单位是秒,默认cookie有效期为浏览器进程,此时cookie存储在浏览器缓存区,浏览器关闭cookie就消失。 setPath(String uri) ,设置cookie的有效目录,比如设置有效目录为/news,那么浏览器访问news下的web资源都会带cookie,默认cookie由哪个servlet发出,有效路径即为servlet所在目录。
      发送:response的addCookie(Cookie cookie)方法,只要在response里放入cookie,服务器在发现response里有cookie会自动发给浏览器。
      获取:request的getCookies()方法会返回一个cookie数组,迭代数组就可去除想要的cookie。
      删除:只要新的cookie的信息,包括名字、有效路径一致,并将时限设置为0,就会删除该cookie。
response.setCharacterEncoding("UTF-8");
	response.setContentType("text/html;charset=UTF-8");
		
	PrintWriter writer=response.getWriter();
	writer.print("您上次访问的时间是:");
		
	//获得cookie
	Cookie[] cookies=request.getCookies();
	for(int i=0;cookies!=null&&i<cookies.length;i++){
		if(cookies[i].getName().equals("lastAccessTime")){
			long lastAccessTime=Long.parseLong(cookies[i].getValue()+"");
			Date date=new Date(lastAccessTime);
			writer.print(date.toLocaleString())
			}
		}
		
		//向cookie发送最新时间数据
	Cookie cookie=new Cookie("lastAccessTime",System.currentTimeMillis()+"");
	cookie.setMaxAge(1*60*24*30);
	cookie.setPath("/day20130928_servlet");
	response.addCookie(cookie);

     (2)cookie一些细节。
       一个cookie只能标识一种信息,它至少含有该信息的名称和设置值。
       一个web站点可以向一个web浏览器发送多个cookie,一个web浏览器也可以存储多个web站点的cookie。
       删除cookie时,是将cookie的最大时限设置为0,注意path必须一致,否则无法删除。

     二、session。
    (1)session的创建、获取和生命周期。
      创建、获取:request的getSession()方法再打一次被调用时服务器就会为浏览器创建一个session对象,而再次被调用时就会得到已创建的对象。需要注意的是有个getSession(boolean create)方法,可以限定是否创建session,如果传入false,那么就不创建session,只获取session,如果之前未创建session,也不再创建session,此方法可以在购物车是使用。
      生命周期:getSession()方法第一次被调用时session被创建,而默认session对象在30分钟内未被调用将被销毁,即使30分钟内浏览器进程并未退出,当然也可能在session的invalidate()方法被调用时session摧毁。此时限可以通过web.xml配置更改,其时间单位分。
<session-config>
  	<session-timeout>10</session-timeout>
  </session-config>

    (2)session工作原理。
     服务器为每个浏览器创建一个session对象,那它如何知道哪个session属于哪个浏览器呢?其实session技术依托于cookie技术,当session被创建后,服务器会向浏览器发送一个有session的id信息的cookie,这样,浏览器带着有session的id信息的cookie就能找到自己的session。当然如果没设置cookie的时限,默认是存在于整个浏览器进程,也就是浏览器关闭cookie就会销毁,那么即使没到session的销毁时限也不能找到浏览器上次访问的session。对此,我们可以通过更改cookie时限来延长session使用。比如做购物车,即使用户将浏览器关闭,只要在session摧毁前打开那么购物车内商品信息依然存在。
public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		HttpSession session= request.getSession();
		//覆盖session的cookie
		String sessionid=session.getId();
		Cookie cookie=new Cookie("JSESSIONID",sessionid);
		cookie.setPath("/day20130928_servlet");
		//设置带有session的id信息的cookie时限
		cookie.setMaxAge(1*60*30);
		response.addCookie(cookie);
		session.setAttribute("name", "Think Pad");
	}

     (3)cookie被禁时解决办法。
       由于session依托于cookie,如果用户的cookie被禁用,那么即使服务器为浏览器创建了session,浏览器没有带有session的id信息的cookie,也无法使用属于浏览器的session,那么如果不解决,比如,一旦用户的浏览器由于某些原因被禁,对于卖家的网站,用户将无法购物,这样将对网站造成损失,解决办法就是可以依托超链接带session的id。可以调用response的encodeURL(String url)方法,它会自动在地址后带上session的id。不过需要注意的是,一旦浏览器关闭,那么在此访问将无法再次得到上次访问时的session,因为浏览器禁用cookie,带有session的id信息的cookie无法存在用户硬盘。
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter writer=response.getWriter();
		
		//解决cookie被禁
		request.getSession();
		
		String url1=response.encodeURL("/day20130928_servlet/servlet/SessionDemo1");
		String url2=response.encodeURL("/day20130928_servlet/servlet/SessionDemo2");
		
		writer.print("<a href='"+url1+"'>购买</a>" );
		writer.print("<a href='"+url2+"'>结账</a>" );
	}

     
     
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics