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(
			  ""
			+ ""
			+ "

" + heading + "

" + "

Information on your session:

" + "" + "" + "" + "" + "" + "" + "
Info Type" + "Value" + "
ID" + "" + session.getId() + "
Creation Time" + "" + new Date(session.getCreationTime()) + "
The Time of Last Access" + "" + new Date(session.getLastAccessedTime()) + "
The Number of Previous Accesses" + "" + accessCount + "
" + "" + ""); } }

第一次访问页面:
Servlet_11th_Session的读写与作用域_第1张图片

多次访问页面后,可以看到访问次数在递增:
Servlet_11th_Session的读写与作用域_第2张图片

如果是不同的浏览器去访问这同一个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就是各种房间,房间里存放着客户端保存的一些数据信息,这时来了一个请求,它带着一把钥匙,能够打开某一个房间的门,那这个请求就能去访问房间里的东西,即该房间面向的是所有能提供正确的钥匙的人,而别的客户端窗口持有的是其它某个房间的钥匙,就不能打开这扇门。



你可能感兴趣的:(Servlet)