2013-04-18 31 views
0

我需要檢查瀏覽器cookie(以及id - 密碼)以決定用戶是否有效。用戶激活帳戶時,我在瀏覽器中設置了Cookie。在登錄時,我需要檢查cookie和證書。我正在使用spring security(daoAuthenticationProvider)進行身份驗證。 我使用的代碼設置的cookie:無法使用HttpClient讀取瀏覽器cookie

public void setCookie(String token, HttpServletRequest request, HttpServletResponse response) { 
    try { 
     Cookie cookie = new Cookie(cookieName, token); 
     cookie.setDomain(cookieDomain); 
     cookie.setPath(cookiePath); 
     cookie.setMaxAge(31536000); // seconds for 365 days 
     response.addCookie(cookie); 
    } catch(Exception e) { 
     log.error("Exception in setting cookie : {}", e.getMessage()); 
    } 
} 

當它來讀取Cookie一段時間,我沒有跟我HttpServletRequest對象。因爲它不是我可以有請求對象的彈簧控制器。所以我在Spring控制器中寫了一個方法,它將返回cookie值。代碼是:

@RequestMapping(value = "gettoken", method = RequestMethod.GET, produces={"text/html"}) 
public ResponseEntity<String> getToken(HttpServletRequest request) { 

    String token = ""; 
    Cookie cookies[] = request.getCookies(); 

    if (cookies != null) { 
     for (int i = 0; i < cookies.length; i++) { 
      System.out.println("Cookie details : " + cookies[i].getName() 
      + "\t" + cookies[i].getValue()); 
      if (cookieName.equalsIgnoreCase(cookies[i].getName())) { 
       token = cookies[i].getValue(); 
       break; 
      } 
     } 
    } else { 
     logger.info("No cookies found..."); 
    } 
    return new ResponseEntity<String>(token,HttpStatus.OK); 
} 

這個spring控制器動作返回cookie值。當我點擊這個URL時,我可以在瀏覽器中看到返回的cookie值。

現在我使用HttpClient從應用程序內部調用此URL。代碼是:

public boolean isCookieValid(String token) { 
    boolean valid = false; 
    try {  
     String requestUrl = serverUrl + "gettoken"; 
     log.info("requestUrl is : {} ", requestUrl); 

     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpContext localContext = new BasicHttpContext(); 
     HttpGet getRequest = new HttpGet(requestUrl.trim()); 
     getRequest.addHeader("accept", "text/html"); 
     HttpResponse response = httpClient.execute(getRequest,localContext); 

     System.out.println("call success : " + response.getStatusLine().getStatusCode()); 
     if (response.getStatusLine().getStatusCode() != 200) { 
      return false; 
     } 

     HttpEntity entity = response.getEntity(); 
     if (entity != null) { 
      String cookieToken = EntityUtils.toString(entity); 
      System.out.println("Cookie Token : " + cookieToken); 
      if(token.equalsIgnoreCase(cookieToken)) { 
       valid = true; 
      } 
     } 
     httpClient.getConnectionManager().shutdown();  
    } catch (Exception e) { 
     log.info("Exception in reading cookies : {}", e.getMessage());  
    } 
    return valid; 
} 

當我使用http客戶端打開spring動作時,我收到HTTP 200響應代碼。但是Spring控制器不能讀取cookie。任何想法可能是什麼問題?有人比這更好的方法?

回答

1

getToken()從它收到的請求中提取cookie。那麼,當你向HttpClient發送一個請求時,你怎麼期待它回來呢?當您使用瀏覽器撥打getToken()時,瀏覽器會發送該Web應用程序先前設置的任何Cookie以及請求。這就是爲什麼你拿回令牌。

+0

行了。我應該怎麼做才能獲取由webapp設置的cookie。因爲我沒有在需要cookie值的類中使用http請求對象。 –

+0

那個cookie的初衷是什麼?除了用戶的身份驗證之外,您是否真的需要它?這將阻止用戶使用最初用於激活其帳戶的瀏覽器以外的任何瀏覽器登錄。 – zagyi

+0

是的,這就是我想要的。我不希望用戶使用瀏覽器以外的瀏覽器登錄系統,而不是從帳戶被激活的瀏覽器登錄系統。 –

相關問題