【JavaWeb学习】session的基本原理

之前认识session是因为登陆模块是使用session来校验用户是否登陆的,但是对session到底怎么实现的并没有仔细想过,本篇就来学习一下session.

1.session是什么

        在WEB应用中,服务器会为每一个用户浏览器创建一个会话对象Session对象,即每个浏览器访问服务器都有独立的session,服务器程序可以把用户数据写道用户浏览器独占的Session中,用户在访问服务器的这段时间(session的默认过期时间为30min),可以直接从session中取出用户保存的数据。这也是登陆模块实现的基础。将用户的信息保存在独立的session中,用户下次访问服务器的时候,就可以去查看session中是否有用户信息,如果有,那么表示已登陆,否则用户需要重新登陆。

【JavaWeb学习】session的基本原理_第1张图片

2.session创建的时机

     是否浏览器访问服务器的任何一个servlet或jsp,服务器都会立即创建一个HttpSession对象呢?

  1. 不一定。若当前的JSP(或Servlet)是客户端访问的当前WEB应用的第一个资源,且Jsp的Page指定的session属性为false,则服务器就不会为JSP创建一个HttpSession对象;session="false"表示当前JSP页面禁用session隐含变量,但可以使用其他显式的HttpSession对象。
  2. 若当前JSP不是客户端访问的当前WEB应用的第一个资源,且其他页面已经创建一个HttpSession对象,则会返回和当前会话关联的HttpSession对象,不会创建一个新的HttpSession对象。
  3.  对于servlet而言:若servlet是客户端访问的第一个WEB应用资源。则只有调用了request.getSession()或request.getSession(true)才会创建HttpSession对象。

3.实战

        新建web项目,取名SessionDemo,注意下面红框部分,这里的版本 值得是Servlet的版本

        选择2.5的时候,会默认勾选创建web.xml文件,而3.0需要在下下一步中手动勾选

        选择2.5的时候,如果新建了Servlet文件,需要在web.xml文件中进行配置,而3.0版本在新建Servlet文件时会自动加上注解,不在需要额外的配置。也就可以省略了web.xml。

【JavaWeb学习】session的基本原理_第2张图片

       新建一个servlet如下所示:

package com.servlet;

import java.io.IOException;

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("/LoginController")
public class LoginController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public LoginController() {
		super();
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		HttpSession session = request.getSession();

		String sessionId = session.getId();
		if (session.isNew()) {
			response.getWriter().print("session创建成功,sessionId为:" + sessionId);
		} else {
			response.getWriter().print("session已存在于服务器,sessionId为:" + sessionId);
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

       运行项目,在浏览器输入http://localhost:8080/SessionDemo//LoginController,结果如下

【JavaWeb学习】session的基本原理_第3张图片

刷新页面,可以看到sessionId没有改变,因为session的默认失效时间为30min。

【JavaWeb学习】session的基本原理_第4张图片

4.修改session的默认name JSESSIONID

        由于eclipse的tomcat配置的是本地tomcat,于是直接找到本地tomcat配置文件修改一番,发现session的name并没有改变,于是怀疑eclipse使用的不是本地tomcat的配置,原来eclipse配置号tomcat后会生成一个Servers项目,eclipse使用的正是Servers项目下的配置。

【JavaWeb学习】session的基本原理_第5张图片

        在conf/context.xml中的context标签中添加一个sessionCookieName属性

【JavaWeb学习】session的基本原理_第6张图片

        好了现在运行项目,在浏览器中输入http://localhost:8080/SessionDemo//LoginController,可以看到session的name已经改成了mySession。

【JavaWeb学习】session的基本原理_第7张图片

参考文献

1.javaWEB总结(21):HttpSession的生命周期

你可能感兴趣的:(javaweb)