这篇开始学习Session技术,Session是会话管理的第二个技术,主要特点是由服务端创建,保存在服务端。每一个浏览器,理论上独占一个session会话。本篇来简单了解下session的原理的代码练习体验下session。
1.session定义
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意,默认请情况下,一个浏览器独占一个session对象。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
2.session原理
这个图和上面session定义结合来看,至少要知道。session是为每一个浏览器创建一个session对象,session保存在服务器端,session是通过session id来区分不同浏览器的,这个id是一个随机的数(下图)。
3.代码
下面来写两个Servlet对象,/demo1用来获取url中参数name的值,然后把这个值写入session,再访问/demo2,取出这个session中name属性的值。
web.xml内容
SessionDemo
sessionDemo1
com.anthony.session.SessionDemo1
sessionDemo1
/demo1
sessionDemo2
com.anthony.session.SessionDemo2
sessionDemo2
/demo2
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
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 + "
");
}else {
out.print("你不能直接访问此资源!"+ "
");
}
}
@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来实现。