【问题标题】:not able to read browser cookie using HttpClient无法使用 HttpClient 读取浏览器 cookie
【发布时间】:2013-04-11 09:33:31
【问题描述】:

我需要检查浏览器 cookie(连同 id - 密码)来确定用户是否有效。当用户激活帐户时,我在浏览器中设置了 cookie。在登录时,我需要检查 cookie 和凭据。我正在使用 spring security (daoAuthenticationProvider) 进行身份验证。 我正在使用代码设置 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。知道可能是什么问题吗?有人有比这更好的方法吗?

【问题讨论】:

    标签: java spring spring-mvc cookies spring-security


    【解决方案1】:

    getToken() 从它收到的请求中提取 cookie。那么,当您使用 HttpClient 向它发送请求而不向请求中添加任何 cookie 时,您如何期望从它返回令牌?当您使用浏览器调用getToken() 时,浏览器会随请求一起发送同一webapp 之前设置的所有cookie。这就是你拿回令牌的原因。

    【讨论】:

    • 好的,知道了。我应该怎么做才能获得 webapp 设置的 cookie。因为我需要cookie值的类中没有http请求对象。
    • 你对那个cookie的初衷是什么?除了用户的身份验证凭据之外,您真的需要它吗?这将阻止用户使用他们最初用于激活其帐户的浏览器以外的任何浏览器登录。
    • 是的,这就是我想要的。我不希望用户使用激活帐户的浏览器以外的浏览器登录系统。
    • 很奇怪,但无论如何,在这种情况下,您必须实现自己的身份验证过滤器、令牌和提供程序。除了用户名和密码之外,过滤器应该创建一个存储该 cookie 的令牌,然后提供者可以检查 cookie 是否有效。您不必从头开始,只需对已使用的类进行子类化:UsernamePasswordAuthenticationFilterUsernamePasswordAuthenticationTokenDaoAuthenticationProvider
    猜你喜欢
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 2012-03-11
    • 2011-01-20
    相关资源
    最近更新 更多