cookie和session的代碼實現


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將狀態保存在服務器端,占用服務器內存,當用戶量過大時,會嚴重影響服務器性能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM