这篇开始学习Session技术,Session是会话管理的第二个技术,主要特点是由服务端创建,保存在服务端。每一个浏览器,理论上独占一个session会话。本篇来简单了解下session的原理的代码练习体验下session。

1.session定义

在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意,默认请情况下,一个浏览器独占一个session对象。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

2.session原理

java session共享的方式 java session的工作原理_java session共享的方式

这个图和上面session定义结合来看,至少要知道。session是为每一个浏览器创建一个session对象,session保存在服务器端,session是通过session id来区分不同浏览器的,这个id是一个随机的数(下图)。

java session共享的方式 java session的工作原理_java session共享的方式_02

 

3.代码

下面来写两个Servlet对象,/demo1用来获取url中参数name的值,然后把这个值写入session,再访问/demo2,取出这个session中name属性的值。

web.xml内容

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>SessionDemo</display-name>
  
  <servlet>
  	<servlet-name>sessionDemo1</servlet-name>
  	<servlet-class>com.anthony.session.SessionDemo1</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>sessionDemo1</servlet-name>
  	<url-pattern>/demo1</url-pattern>
  </servlet-mapping>
  
  <servlet>
  	<servlet-name>sessionDemo2</servlet-name>
  	<servlet-class>com.anthony.session.SessionDemo2</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>sessionDemo2</servlet-name>
  	<url-pattern>/demo2</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

SessionDemo1.java

package com.anthony.session;

import java.io.IOException;

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

public class SessionDemo1 extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		//加入请求地址是通过?name=Anthony方式,这里得到name的value
		String name = req.getParameter("name");
		//请求对象得到服务器创建的session对象
		HttpSession session = req.getSession();
		session.setAttribute("name", name);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
	
	
}

SessionDemo2.java

package com.anthony.session;

import java.io.IOException;
import java.io.PrintWriter;

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

public class SessionDemo2 extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		PrintWriter out = resp.getWriter();
		//得到一个HttpSession对象
		HttpSession session = req.getSession();
		//得到session中属性name的值
	    String name = (String)session.getAttribute("name");
	    if(name != null) {
	    	out.print(name + "<br/>");
	    }else {
	    	out.print("你不能直接访问此资源!"+ "<br/>");
	    }
	    
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
	
	
}

部署到tomcat上,打开浏览器先访问http://localhost:8080/SessionDemo/demo1?name=Anthony

注意访问的时候一定要加上?name=xxx

然后访问http://localhost:8080/SessionDemo/demo2

访问/demo2会打印出 Anthony

 

下面我们再开一个浏览器,例如上面用火狐,接下来用IE,直接访问http://localhost:8080/SessionDemo/demo2

打印出 你不能直接访问此资源!

因为浏览器不同,IE浏览器拿不到火狐浏览器访问创建的session。session还有一个特点,可以保留一些用户独享数据,例如每个人打开淘宝的购物车肯定和他人是不一样的,下一篇学习购物车如何通过session来实现。