2016-03-06 57 views
1

我使用Apache Http組件爲本地主機設置cookie。當我返回cookie我得到的輸出:Apache Http組件 - 設置Cookie

[version: 0][name: testCookie][value: test][domain: http://localhost:9090/][path: /][expiry: Mon Aug 07 19:11:56 BST 2017] 

這讓我想起了餅乾已定,但是當我在Chrome中檢查,看它是否在Chrome://設置/餅乾有什麼也沒有。

public Object makeCookie(String p) throws IOException, MalformedCookieException{ 

     Calendar myCal = Calendar.getInstance(); 
     myCal.set(2017, 07, 07); 
     Date theDate = myCal.getTime(); 
     CookieStore cookieStore = new BasicCookieStore(); 
     BasicClientCookie cookie = new BasicClientCookie("testCookie",p); 
     // Set effective domain and path attributes 
     cookie.setDomain("http://localhost:9090/"); 
     cookie.setPath("/"); 
     cookie.setExpiryDate(theDate); 
     cookieStore.addCookie(cookie); 
     // Set attributes exactly as sent by the server 
     cookie.setAttribute(ClientCookie.PATH_ATTR, "/"); 
     cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "http://localhost:9090/"); 
     CloseableHttpClient httpclient = HttpClients.custom() 
       .setDefaultCookieStore(cookieStore) 
       .build(); 

     return cookie; 
} 

我一直停留在這幾個小時,我只是不明白,爲什麼它沒有被存儲在瀏覽器

回答

0

其實你的代碼只是會在客戶端的cookie存儲,但不發送在任何地方創建cookie

根據維基百科(https://en.wikipedia.org/wiki/HTTP_cookie)的說法,「cookie是從網站發送的一小段數據,並在用戶瀏覽時存儲在用戶的Web瀏覽器中。」

HttpClient不是你需要的實體,因爲它是一個客戶端,而不是服務器。您可以使用它來執行對網站的HTTP請求,但它只是消費者,就像您本地的瀏覽器一樣。因此,即使您在客戶端指定了Cookie存儲,它也不會影響您的本地瀏覽器。服務器(比如說網站)是向客戶發送cookie的人。

代碼中的HttpClient和本地瀏覽器是2個獨立的客戶端。他們可以從網站接收cookies,但這兩個客戶本身不是網站。這就是爲什麼CloseableHttpClient對象在這裏沒用。此外,你不要在你的代碼中使用它。它也可能泄漏內存,因爲你沒有正確關閉它。

正如我已經說過,您的代碼只是創建cookie。所以你需要發送創建的cookie到客戶端。你甚至不需要創建cookie存儲,你可以直接創建cookie本身。

因此,您需要使用Servlet API創建一個簡單的Web應用程序。然後,您可以將創建的cookie附加到所需的HTTP請求處理程序中的HttpServlerResponse對象。你可以做這樣的事情(SpringMVC例子):

@RequestMapping(value = "/", method = RequestMethod.GET, produces = "text/html") 
    public String index(HttpServletResponse response) { 
     // no prepareCookie implementation here 
     Cookie myCookie = prepareCookie(); 
     response.addCookie(myCookie); 
     // view name 
     return "index"; 
    } 
+0

感謝您的回覆。問題是,我正在使用nanohttp(一個lightwight服務器),誰的cookie不提供設置路徑的方法。這就是爲什麼我不想使用servlet API並試圖找到另一種通過cookie的方法 – Vickie