Session and Cookies 2
转载自:http://www.java-programming.info/tutorial/pdf/csajsp2/08-Session-Tracking.pdf
http://www.java2s.com/Code/Java/Servlets/Usecookietosavesessiondata.htm
Session Tracking?
HttpSession session = request.getSession();synchronized(session) {SomeClass value =(SomeClass)session.getAttribute("someID");if (value == null) { value = new SomeClass(...);}doSomethingWith(value);session.setAttribute("someID", value);}
?
?The J2EE blueprints say not to botherThere are no race conditions when multiple different?users access the page simultaneouslyOn the face of it, it seems practically impossible for the?same user to access the session concurrentlyThe rise of Ajax makes synchronization?mportantWith Ajax calls, it is actually quite likely that two?requests from the same user could arrive concurrentlyPerformance tipDon’t do “synchronized(this)”!Use the session or perhaps the value from the session as?the label of the synchronized block?
? ? ? HttpSession Methods:
getAttributeExtracts a previously stored value from a session object.?Returns null if no value is associated with given name.
setAttributeAssociates a value with a name. Monitor changes: values?
implement HttpSessionBindingListener.
removeAttributeRemoves values associated with name.getAttributeNames
Returns names of all attributes in the session.
getId
Returns the unique identifier.
isNew
Determines if session is new to client (not to page)
Returns time at which session was first createdgetLastAccessedTime
Returns time at which session was last sent from clientgetMaxInactiveInterval, setMaxInactiveInterval
Gets or sets the amount of time session should go without?access before being invalidated
invalidateInvalidates current session
Use cookie to save session data:
?
import java.io.IOException;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ShoppingCartViewerCookie extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); String sessionid = null; Cookie[] cookies = req.getCookies(); if (cookies != null) { for (int i = 0; i < cookies.length; i++) { if (cookies[i].getName().equals("sessionid")) { sessionid = cookies[i].getValue(); break; } } } // If the session ID wasn't sent, generate one. // Then be sure to send it to the client with the response. if (sessionid == null) { sessionid = generateSessionId(); Cookie c = new Cookie("sessionid", sessionid); res.addCookie(c); } out.println("<HEAD><TITLE>Current Shopping Cart Items</TITLE></HEAD>"); out.println("<BODY>"); // Cart items are associated with the session ID String[] items = getItemsFromCart(sessionid); // Print the current cart items. out.println("You currently have the following items in your cart:<BR>"); if (items == null) { out.println("<B>None</B>"); } else { out.println("<UL>"); for (int i = 0; i < items.length; i++) { out.println("<LI>" + items[i]); } out.println("</UL>"); } // Ask if they want to add more items or check out. out.println("<FORM ACTION=\"/servlet/ShoppingCart\" METHOD=POST>"); out.println("Would you like to<BR>"); out.println("<INPUT TYPE=SUBMIT VALUE=\" Add More Items \">"); out.println("<INPUT TYPE=SUBMIT VALUE=\" Check Out \">"); out.println("</FORM>"); // Offer a help page. out.println("For help, click <A HREF=\"/servlet/Help" + "?topic=ShoppingCartViewerCookie\">here</A>"); out.println("</BODY></HTML>"); } private static String generateSessionId() throws UnsupportedEncodingException { String uid = new java.rmi.server.UID().toString(); // guaranteed unique return URLEncoder.encode(uid,"UTF-8"); // encode any special chars } private static String[] getItemsFromCart(String sessionid) { return new String[]{"a","b"}; }}
?