cookie和session的代碼實現
1、設置cookie
今天筆試題考的是cookie的設置,我竟然選了request也可以設置cookie,我的天呀。
我們來看如何在response設置吧
public void service(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{ Cookie c = new Cookie("name","jenkins"); resp.addCookie(c); }
這樣子設置,實際上是在返回的消息頭中加了一個key-value,key為Set-Cookie,value也是key-value的形式,上面的就是:name=jenkins,多個cookie用分號(;)隔開
消息頭中的樣式是:Set-Cookie:name=jenkins;JSESSIONID=ERERE23343423
其實如果要在request中把cookie返回到服務器端,我們可以在請求的消息頭中加一個值:
package servletbase; import java.io.IOException; import java.io.Writer; import java.util.ArrayList; import java.util.List; 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 org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpClient; public class MyServlet01 extends HttpServlet{ public void postCookieToServer(){ HttpClient client = new HttpClient(); List<Header> headers = new ArrayList<Header>(); //把key為JSESSIONID的cookie上傳到服務器,服務器會根據這個id來判斷 //發起該會話的用戶是不是之前登錄過,做鑒權 headers.add(new Header("cookie","JSESSIONID=RERER3")); //設置消息頭 client.getHostConfiguration().getParams().setParameter("http.default-headers", headers); } }
2、查詢Cookie
在請求對象中獲取:
public void getCookieFromRequest(HttpServletRequest request){ //獲取cookie數組 Cookie[] cookies = request.getCookies(); for(Cookie cookie:cookies){ //獲取cookie的key-value String name = cookie.getName(); String value = cookie.getValue(); } }
3、修改Cookie
public void updateCookieFromRequest(HttpServletRequest request,HttpServletResponse response){ //獲取cookie數組 Cookie[] cookies = request.getCookies(); for(Cookie cookie:cookies){ //修改cookie的value String name = cookie.getName(); if(name.equals("city")){ cookie.setValue("guangzhou"); response.addCookie(cookie); } } }
4、Cookie的編解碼(value為中文時需要編碼,否則訪問時會報錯)
//編碼 Cookie c = new Cookie("city",URLEncoder.encode("廣州","utf-8")); //解碼 String value = c.getValue(); value = URLDecoder.decode(value,"utf-8");
5、Cookie的其他方法
//設置生存時間,單位是秒,默認小於零,保存在內存中。等於零是即刻刪除 cookie.setMaxAge(30) //設置路徑,瀏覽器訪問服務器時只向cookie路徑或者子路徑發送cookie,以下訪問/web/index.html是會發cookie,但訪問/myweb/index.html就不會了 cookie.setPath("/web");
6、Cookie的限制
a、可以被用戶限制
b、保存在瀏覽器,不安全,敏感數據要進行加密
c、只能保存少量數據,大約4k左右
d、個數有限制
e、只能保存字符串
7、Session定義和工作原理
簡單來說Session就是服務器為每一個訪問的瀏覽器分配的內存空間,它有一個唯一的id,並且會將這個jsessionid以cookie的形式發送到瀏覽器(服務器調用了getSession()方法才會返回jsessionid到瀏覽器,並不是每個請求過來都返回),瀏覽器再次訪問時就會把這個jsessionid發送到服務器,服務器就能找到session對象。
如果瀏覽器再次訪問(請求消息頭中帶有jessionid)時,服務器能找到對應的sessionid,則服務器不再返回sessionid到瀏覽器。
8、獲取Session
//參數為true時一定會返回session對象 HttpSession session = request.getSession(true); //不加參數默認是true HttpSession session = request.getSession(); //參數為false時,則沒有sessionid時返回null //有sessionid,但找不到session對象時也返回null,能找到session對象就返回該對象 HttpSession session = request.getSession(false);
9、使用Session綁定對象
1
2
3
4
5
6
7
8
9
|
//綁定對象
void
session.setAttribute(String name,Object boj);
//獲取綁定對象
Object session.getAttribute(String name);
//移除綁定對象
void
session.removeAttribute(String name);
//刪除session對象
session.invalidate();
|
10、Session超時
服務器會將空閑時間過長的session對象刪除以節省內存空間資源,一般是30分鍾
在tomcat的conf/web.xml文件夾設置(單位是分鍾):
<session-config>
<session-timeout>30</session-timeout>
</session-config>
通過編程修改:
void session.setMaxInactiveInterval(int seconds)
11、瀏覽器禁用cookie后果及解決方法
瀏覽器禁用cookie后,session就不能用了,因為jsessionid不能在瀏覽器保存。
解決辦法:使用URL重寫方法解決,就是在重定向時在url中加sessionid參數,就不需要瀏覽器保存了。看以下的例子,假如登錄驗證過程了,需要重定向到首頁
if(name.equals("admin") && pwd.equals("admin")){ session.setAttribute("name",name); //重定向到首頁 //response.sendRedirect("index.jsp"); //改為,其會在路徑后面加上jsessionid, //System.out.println("url:" + resp.encodeRedirectURL("index.html")); --> url:index.html;jsessionid=4E885D5D87247441F761C96ACA9A7B68 response.sendRedirect( response.encodeRedirectURL("index.jsp")); }
登錄之后我們就可以把sessionid保存到頁面,訪問時把它帶上就好了,可以在url后面加上sessionid,如下:
localhost:8080/testweb/servlet01;jsessionid=4E885D5D87247441F761C96ACA9A7B68
另外如果在服務器端沒有生成session對象,服務器是不會返回sessionid的cookie到瀏覽器的,即在服務器端要調用request.getSession()
12、Session的優缺點
優點:
a、安全(狀態保存在服務器端)
b、能保存的數據類型更多,cookie只能是字符串
c、能保存更多數據
缺點:
session將狀態保存在服務器端,占用服務器內存,當用戶量過大時,會嚴重影響服務器性能。