2013-04-18 102 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

是的,这就是我想要的。我不希望用户使用浏览器以外的浏览器登录系统,而不是从帐户被激活的浏览器登录系统。 –