上次學習了cookie,此次固然就學習session了。session和cookie很相像,都是爲了解決類似的問題存在的。不一樣在於,session存在於服務端,而cookie存在於客戶端。html
上個最簡單的demojava
package demo; import java.io.IOException; import java.io.PrintWriter; 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("/session.do") public class SessionServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub resp.setContentType("text/html;charset=utf-8"); PrintWriter out = resp.getWriter(); out.print("hello,session"); HttpSession session = req.getSession(); String name = (String) session.getAttribute("name"); if(name == null) { out.print("<br/> no session data now"); session.setAttribute("name", "tmac"); } else { out.println("<br /> hello, " +name); session.invalidate(); } } }
這個demo實現的是當session中存在name的值,則顯示並銷燬,不存在則建立,因此瀏覽器顯示的就是兩種效果:web
咱們能夠用request的getSession方法獲得session,getSession重載了兩種方法,getSession()返回一個session,若是不存在則建立一個再返回。而getSession(boolean b)提供了一個選項,若是b==false,不存在session的話返回null。瀏覽器
session提供了getAttribute和setAttribute方法,咱們能夠獲取和存放須要的值。getAttribute返回的是object,這就意味着咱們不止能夠存放String的值。tomcat
session的invalidate方法能夠將session失效。setMaxInactiveInterval方法能夠設置session 的時間,若是在這段時間內瀏覽器都沒有發送請求的話,session就會自動失效。服務器
這裏就有一個問題,發送請求的瀏覽器有不少,服務器是如何分辨不一樣的瀏覽器來獲取特定的session呢?在tomcat中,使用session機制的時候,會在客戶端設置一個cookie:JSESSIONID,每次發送請求的時候將這個cookie一塊兒放入請求行中,這樣tomcat就經過這個id找到對應的session(session提供了getId()方法),這樣不一樣的瀏覽器就能獲取不一樣的session了。這樣的話也有個問題,cookie默認是在關閉瀏覽器則失效,那麼也就說關閉瀏覽器的話session一樣也失效,在開啓瀏覽器發送請求一樣會生成一個新的session。固然servlet也提供了設置的接口,咱們能夠本身設置cookie的存活時間。能夠再web.xml中進行設置session-config,也能夠實現servletcontextlistener。這個之後再進行學習。cookie