转载自:http://hi.baidu.com/chen_767/item/8a769a72004bb846ef1e53f2
1. session的原理
request对象有个方法是getSession()
首先看浏览器是否发送了Cookie (JSESSIONID) ,如果发了,拿着id去内存中找对应的session对象返回
如果没有发Cookie或者没找到对应的Session对象,创建一个新的Session对象
getSession( boolean create)
create 为true的时候,如果内存有session就返回,没有就创建新的
create为false的时候,意味着只查找不创建,有就返回,没有不创建,返回null;
2. session的运行要依靠cookie来发送JSESSIONID
如果想让多个浏览器共享一个session,我们就需要人工发送Cookie,并设置Cookie的有效时间
3.如果浏览器禁用Cookie,那么Session也玩不起来了
浏览器禁用Cookie
要想让session好用,就需要在页面跳转时发送sessionid
有一个技术url重写
重写后的地址会在原有的url地址的基础上加上JSESSIONID
如果是超链接或表单提交的地址,重写方式如下:
String newUrl = response.encodeURL(url);
如果是请求重定向的地址,方式如下:
String newUrl = response.encodeRedirectURL(url);
-------下面示例: 通过session传递参数 -------
SessionDemo1.java:
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// request.setCharacterEncoding("utf-8");
// 如果浏览器没有把session发给服务器,则下面的代码会创建一个新的
// session, 如果浏览器发来的cookie中有JSESSIONID则获得这个session
HttpSession session = request.getSession();
// 使用下面的url
// http://localhost:8180/myweb/SessionDemo1?name=111
// 访问服务器后,服务器通过getParameter获得name这个参数对应的值111
String name = request.getParameter("name");
// session 也是一个域对象 获得请求参数 name 的值存入 session 域
session.setAttribute("name", name);
// 请求重定向到 SessionDemo2
response.sendRedirect("/myweb/SessionDemo2");
// 如果刚才request.getSession()创建了新的JSESSIONID cookie后,服务器会自动
// 将JSESSIONID cookie发给浏览器, 如果刚才用的是浏览器发来的JSESSIONID cookie
// ,则来再给浏览器发JSESSIONID cookie
// 如果是创建了新的JSESSIONID cookie的情况: 浏览器在收到新JSESSIONID cookie后,
// 才去带着这个 JSESSIONID cookie去访问"/myweb/SessionDemo2"页面
}
SessionDemo2.java:
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// response.setContentType("text/html;charset=utf-8");
// 获得 session 对象
HttpSession sesstion = request.getSession(false);
if (sesstion == null)// 说明浏览器没有访问SessionDemo1就直接访问了SessionDemo2,所以没有session
return;
// 从 session 域中取出name
String name = (String) sesstion.getAttribute("name");
response.getWriter().println("name:");
response.getWriter().write("name=" + name);
}