JavaWeb JSP内置对象之session对象

4、session对象

在WEB应用中,当一个客户首次访问服务器上的某个jsp页面时,jsp引擎(比如TOMCAT)将为这个客户创建一个session对象,当客户关闭浏览器离开之后,session对象被注销。
设置session的目的是为了服务器端识别客户。由于http协议是无连接的。客户浏览器与服务器建立连接,发出请求,得到响应。一旦发送响应,Web服务器就会忘记你是谁。下一次你再做请求的时候,Web服务器不会认识你。换句话说,它们不记得你曾经做过请求,也不记得它们曾经给你发出过响应,什么都不记得了。有时这样做没什么,但有些时候可能需要跨多个请求保留与客户的会话状态。比如在网上购物这样的应用中,当客户在选完商品后,进入结算页面后,服务器端需要知道这个客户的购物车中有哪些商品。在网站计数器应用中,服务器端同样需要知道是一个新客户访问网站,还是老客户在进行刷新操作,以正确统计访问量。上述的这些需求,都需要通过session实现。

4.1 session的常用方法

session对象常用方法如下表所示。

方法名称说明
setAttribute(String attName,Object value)设定指定名字属性值,并把它存储在session对象中。
getAttribute(String attName)获取指定名字属性值,若属性不存在,返回null。
Enumeration getAttributeNames()返回session对象中存储的每一个属性对象,结果是枚举类对象。
removeAttribute(String attName)删除指定属性。
setMaxInactiveInterval(int interval)设置session有效时间,单位秒。
getMaxInactiveInterval( )获取session对象生存时间,单位秒。
invalidate()销毁session,并释放所有与之相关联的对象。要牢记会话与用户相关联,而不是单个Servlet或Jsp页面。
getId()返回当前session的ID。
isNew()判断当前用户是否为新用户,可以判断用户是否刷新了当前页面。如果用户还没有用这个会话ID做过响应,isNew()就返回true。

实例代码:

通过一个页面输入姓名,跳转另一个页面选择购买,跳转另一个页面进行结算
登录页面:

<%@ page pageEncoding="UTF-8"%>
<HTML>
<BODY>
	欢迎访问,请输入你的姓名
	<FORM>
		<INPUT type="text" name="name">
		<INPUT type="submit" name="submit" value="提交">
	</FORM>
	<%
		String name = request.getParameter("name");
		if (name == null) {
			name = "";
		} else {
			byte b[] = name.getBytes("ISO-8859-1");
			name = new String(b);
			session.setAttribute("customerName", name);
			out.print(name);
		}
	%>
	<%
		if (name.length() > 0) {
	%>
	<A HREF="book.jsp"> 欢迎去选择书籍!</A>
	<%
		}
	%>
	<FONT>
</BODY>
</HTML>

选择书籍页面:

<%@ page pageEncoding="UTF-8"%>
<HTML>
<BODY>
	<A HREF="third_example4.jsp"> 修改姓名!</A>
	<p>请选择您要购买的书:
	<FORM>
		<input type="checkbox" name="item" value="Java">
		Java
		<input type="checkbox" name="item" value="JSP">
		JSP
		<input type="checkbox" name="item" value="c">
		c
		<p>
			<input type="submit" name="submit" 	 value="提交">
		
	</FORM>
	<%
		String book[] = request.getParameterValues("item");
		
		if (book != null) {
			for (int k = 0; k < book.length; k++) {
				session.setAttribute(book[k], book[k]);
				out.print(book[k]);
			}
		}
	%>
	<A HREF="count.jsp">去结帐!</A>
</BODY>
</HTML>

结算页面:

<%@ page import="java.util.*" pageEncoding="GB2312" %>
<HTML>
<BODY>
 这里是结帐处:
<%
	String personName=(String)session.getAttribute("customerName");
    out.print("<br>您的姓名:"+personName);
    Enumeration enumGoods=session.getAttributeNames();
    out.print("<br>购物车中的商品:<br>");
    while(enumGoods.hasMoreElements()){
    	String key = (String) enumGoods.nextElement();
		String goods = (String) session.getAttribute(key);
		if (!(goods.equals(personName)))
			out.print(personName + "|" + goods + "<br>");
	}
%>
 <p>
 <A HREF="book.jsp">请继续购买书籍!</A>
 <BR><A HREF="third_example4.jsp">修改姓名!</A>
</BODY>
</HTML>

程序说明:

session.setAttribute(“customerName”,name);
设定指定名字"customerName"属性值为“张三”,并把它存储在session对象中。
session.getAttribute(“customerName”);
获取指定名字为"customerName"属性值“张三”。
Enumeration enumGoods=session.getAttributeNames();
返回session对象中存储的每一个属性对象,结果是枚举类对象。

运行结果:

输入姓名,点击提交按钮。
在这里插入图片描述

点击欢迎去选择书籍链接跳转在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2 session跟踪

因为http协议是无连接的,浏览器访问网页的过程是:建立连接,发出请求,得到响应,然后关闭连接。就是说,连接只针对一个请求/响应过程。由于http连接不会持久保留,所以容器就识别不出发出第二个请求的客户与前一个请求的客户是不是同一个客户。比如在网上购物这样的应用中,当客户在选完商品后,进入结算页面后,服务器端需要知道这个客户的购物车中有哪些商品。JSP解决这类问题方法就是session跟踪,通过session跟踪来辨认客户端,一般session跟踪有以下几种方法:
 使用Cookie
 URL重写
 使用隐藏表单域

4.2.1、Cookie

Cookie是Web服务器发送至客户端浏览器的小段文本信息,在以后访问该服务器时浏览器会不做任何修改的向服务器返回这些信息,可见Cookie目的是为了方便用户以及向服务器端传送相关信息。
当一个用户首次访问服务器上的一个Jsp页面时,Jsp引擎产生一个session 对象,同时分配一个String类型的ID号(session ID),Jsp引擎同时将这个ID号发送到用户端,存放在Cookie中,这样session对象和用户之间就建立了一一对应的关系。当用户再访问连接该服务器的其它页面时,不再分配给用户新的session对象,直到关闭浏览器或该session达到最大生存时间后,服务器端该用户的session对象才取消,并且和用户对应关系消失。当重新打开浏览器再连接到该服务器时,服务器为该用户创建一个新的session对象。
cookie的发送
1)创建Cookie对象

Cookie cookie=new Cookie(“name”,”value”);

2)设置最大时效

cookie.setMaxAge(60);

3)将Cookie放入到HTTP响应报头.

response.addCookie(cookie);
如果你创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie,存储在浏览器的内存中,用户退出浏览器之后被删除。如果你希望浏览器将该cookie存储在磁盘上,则需要使用setMaxAge(),并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
发送cookie需要使用HttpServletResponse的addCookie方法,将cookie插入到一个Set-Cookie HTTP请求报头中。同样要记住响应报头必须在任何文档内容发送到客户端之前设置。

cookie的读取
1)调用getCookies()方法
要获取有浏览器发送来的cookie,需要调用HttpServletRequest的getCookies()方法,这个调用返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。
2)对数组进行循环,调用每个cookie的getName()方法获得cookie名字,直到找到感兴趣的cookie为止,调用getValue()方法得到cookie的值。
 例如:

  String cookieName = “userID”;
      Cookie cookies[] = request.getCookies();
      if (cookies!=null){
           for(int i=0;i<cookies.length;i++){
             Cookie cookie = cookies[i];
            if (cookieName.equals(cookie.getName())){
              doSomethingWith(cookie.getValue());
            }
        }
   }

4.2.2、URL重写

如果客户端不支持Cookie,那么客户在不同网页之间的session对象可能是互不相同的,因为服务器无法将ID存放到客户端,就不能建立session对象和客户的一一对应关系。可以通过URL重写来实现session对象的唯一性。
所谓URL重写,就是当客户从一个页面连接到同一WEB服务目录一个页面时,通过向这个新的URL添加参数,把session对象的ID传带过去,这样就可以保证客户在该网站各个页面中的session对象是完全相同的。以http://host/path/file.html/;jsessionid=a1234为例,jsessionid=a1234作为会话标示符附加在URL尾部。就是URL+; jsessionid=a1234。
根本不能对静态页面完成URL重写!使用URL重写只有一种可能,就是作为会话一部分的所有页面都是动态生成的!不能硬编码会话ID,因为ID在运行之前并不存在。所以依赖于会话,就要把URL重写作为一条后路,另外,因为需要URL重写,就必须在响应HTML中动态生成URL!这意味着必须在运行时处理HTML。
如果客户不接受cookie,URL重写是自动的,但只有当你对URL完成了编码时它才奏效。必须通过response对象调用encodeURL()或encodeRedirectURL()方法来运行所有URL,其他的所有事情都由容器来做。
实现URL重写。比如从a.jsp页面重定向到b.jsp页面,但还想使用一个会话,就要首先在程序片中实现URL重写:

String str=response.encodeRedirectURL(/b.jsp”)

然后将连接目标写成<%=str%>即可。
注意:URL重写有什么缺点
对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL。每个引用你的站点的URL,以及那些返回给用户的URL(即使通过间接手段,比如服务器重定向中的Location字段)都要添加额外的信息。
  这意味着在你的站点上不能有任何静态的HTML页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此,每个页面都必须使用servlet或JSP动态生成。即使所有的页面都动态生成,如果用户离开了会话并通过书签或链接再次回来,会话的信息都会丢失,因为存储下来的链接含有错误的标识信息,该URL后面的SESSION ID已经过期了。

4.2.3、使用隐藏表单域

HTML表单可以含有如下条目:

<input type=”hidden” name=”session” value=”a1234”>

这个条目含义:在提交表单时,要将指定的名称和值自动包括在GET和POST数据中。这个隐藏域可以用来存储有关会话信息,但它主要缺点是:仅当每个页面都是有表单提交而动态生成时,才能使用这种方法。单击常规的

  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

废人一枚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值