Servlet_11th_Session的读写与作用域

一、如何读写session
1)通过session.setAttribute(键,值)的方式把数据保存在指定的键中。
2)通过session.getAttribute(键)来获取与键相对应的值。
3)其中,键只能是String类型,而值为Object类型。

4)举例:

package com.hpe.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/ShowSession")

public class ShowSession extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		 
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		String title = "Session Tracking Example";
		
		HttpSession session = request.getSession(true);
		String heading;
		 
		Integer accessCount = (Integer)session.getAttribute("accessCount");
		if(accessCount == null) {
			accessCount = 0;
			heading = "Welcome Newcomer";
		} else {
			accessCount++;
			heading = "Welcome Back";
		}
		
		session.setAttribute("accessCount", accessCount);
		
		out.println(
			  "<html>"
			+ "<body bgcolor=\"#FDF5E6\">"
			+ "<h1 align=\"center\">" + heading + "</h1>"
			+ "<h2>Information on your session:</h2>"
			+ "<table border=1 align=\"center\">"
			+ "<tr bgcolor=\"#FFAD00\">" + "<th>Info Type" + "<th>Value"
			+ "<tr>" + "<td>ID" + "<td>" + session.getId()
			+ "<tr>" + "<td>Creation Time" + "<td>"
			+ new Date(session.getCreationTime())
			+ "<tr>" + "<td>The Time of Last Access" + "<td>"
			+ new Date(session.getLastAccessedTime())
			+ "<tr>" + "<td>The Number of Previous Accesses" + "<td>" + accessCount
			+ "</table>"
			+ "</body>"
			+ "</html>");
	}
}

第一次访问页面:


多次访问页面后,可以看到访问次数在递增:


如果是不同的浏览器去访问这同一个URL,不会认为是同一个客户端,在之前的博客中已经知道,这种情况下服务器会创建不同的session对象,分配不同的sessionID,即不同的浏览器统计到的是各自对该servlet的访问次数,服务器会给不同的浏览器不同的sessionID,归根结底是因为不同的浏览器之间的cookie是不共享的。

试想一下,如果电脑上的浏览器的cookie是共享的,那真的就是一台机器就是一个sessionID了,不过浏览器厂商绝对不会允许这样的情况出现,因为不安全。

总结:
①在Jsp/Servlet中,如果浏览器不支持cookie,可以通过URL重写来实现,就是将一些额外数据追加到表示会话的每个URL末尾,服务器在该标识符与其存储的有关的该会话的数据之间建立联系。如:hello.jsp?jsessionid=1234
②可以通过程序来终止一个会话。如果客户端在一定时间内没有操作,服务器会自动终止会话。
③通过HttpSession来读写session。

最后的总结:
读写session用于确定用户是否处于登录状态:
在确定用户是否登录时,可以这样来做:在一个servlet中如果用户登录成功,则在session中set一个标志位,当用户去访问别的servlet时,
先去session中去拿这个标志位,如果拿出来为空,说明没有set过,也就是没有登录或没有登录成功的状态,如果拿到了标志位,说明此前已经登录成功。


补充:关于session的路径问题

session不像cookie一样存在路径问题:同一个application下的servlet / jsp可以共享同一个session,前提是sessionID相同。

也就是说,一个浏览器访问服务器时,服务器创建了一个session对象,只要这个浏览器没有全部被关闭,那么cookie就活着,只要cookie活着,sessionID就还在,那么再去访问服务器中的那个Web项目时,拿着这个ID号就能找到之前的那个session对象。

所以session的作用域就是:

对于一个session对象来说,在同一个Web项目下,只要该客户端窗口能提供与之匹配的sessionID,该客户端就有权限访问该session对象的内容。


形象来说,服务器是一个小区,我们的Web项目是其中的一栋楼,session就是各种房间,房间里存放着客户端保存的一些数据信息,这时来了一个请求,它带着一把钥匙,能够打开某一个房间的门,那这个请求就能去访问房间里的东西,即该房间面向的是所有能提供正确的钥匙的人,而别的客户端窗口持有的是其它某个房间的钥匙,就不能打开这扇门。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值