小案例
package cn.cast.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 {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
session.setAttribute("name", "洗衣机");
//摧毁代码session
//session.invalidate();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package cn.cast.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;
//结账servlet
public class SessionDemo3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
//只获取不创建session,在查看购物车时节省性能,假设用户没有购买商品(没有创建session),查看购物车,使用下面的代码就不会创建session,r如果使用上面代码,就会创建session,效果一样但是性能上有优劣。
HttpSession session = request.getSession(false);
String value = (String) session.getAttribute("name");
out.println("你购买了"+value);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
session的生命周期,session是会话级别的,打开多个浏览器创建的是隔离的session
并不是打开浏览器就创建,session的创建需要触发,用户点击某个超链接时由servlet创建,在不使用时,默认30分钟后销毁,用户关闭浏览器后session不会立即销毁,也要等到30分钟以后才销毁。
在web.xml中配置session的销毁时间。单位是min
<session-config>
<session-timeout>10</session-timeout>
</session-config>
程序中也能使用代码摧毁session
session.invalidate();
session的实现原理基于cookie
用户访问服务器创建session的时候,服务器会返回一个带有id号的cookie给浏览器,浏览器再次访问浏览器时会带cookie给服务器,如果没有携带cookie给服务器,服务器会创建session,并再次回写cookie.这个cookie没有设有效时间,当浏览器关闭时,cookie就会被摧毁,所以下次打开浏览器访问时会重新创建session.
基于上面的原理,要实现用户在关闭浏览器重新打开的时候,购物信息任然存在就需要设置回写cookie的存在时间(30min).
只需要重写demo2
package cn.cast.session;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
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 {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
String sessionid = session.getId();
Cookie cookie = new Cookie("JSESSIONID", sessionid);
cookie.setMaxAge(30*60);
cookie.setPath("/WEB");
response.addCookie(cookie);
session.setAttribute("name", "洗衣机");
//session.invalidate();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
场景:当浏览器禁止使用cookie时,服务器获取不到session
应对方法,当浏览器访问网站的时候服务器就会创建一个session.当用户购买商品时,超链接后面会添加sessionid号,服务器根据这个id号存取数据。
package cn.cast.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 WelcomeSeverlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
request.getSession();
//sun公司提供的带sessionid号的url获取方法,当用户没有禁用cookie时,方法不会重写url
String url1= response.encodeURL("/WEB/servlet/SessionDemo2");
String url2= response.encodeURL("/WEB/servlet/SessionDemo3");
out.println("<a href='"+url1+"'>购买</a>");
out.println("<a href='"+url2+"'>结账</a>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
禁用cookie后关闭浏览器,开启浏览器时就没办法保存数据了。