Java 在android中区分HTTPOnly Cookie与其他Cookie
在我当前的项目中,我们正在Android应用程序和服务器之间实现会话处理。 现在根据我们的设计,Android应用程序应该只接受HTTP Cookies,并删除所有其他Cookies。 但是查看所有可用的选项,我找不到任何类或方法来帮助我识别cookie是否为HTTPOnly 我以以下方式存储cookie:Java 在android中区分HTTPOnly Cookie与其他Cookie,java,android,cookies,httponly,Java,Android,Cookies,Httponly,在我当前的项目中,我们正在Android应用程序和服务器之间实现会话处理。 现在根据我们的设计,Android应用程序应该只接受HTTP Cookies,并删除所有其他Cookies。 但是查看所有可用的选项,我找不到任何类或方法来帮助我识别cookie是否为HTTPOnly 我以以下方式存储cookie: connections = (HttpURLConnection) serverURL.openConnection(); // Setting cookie
connections = (HttpURLConnection) serverURL.openConnection();
// Setting cookies manager
java.net.CookieManager manager = new java.net.CookieManager();
manager.setCookiePolicy(new CookiePolicy() {
@Override
public boolean shouldAccept(URI uri, HttpCookie cookie) {
return cookie.getSecure();
}
});
CookieHandler.setDefault(manager);
connections.setDoInput(true);
connections.setDoOutput(true);
connections.setConnectTimeout(TIME_OUT);
connections.getOutputStream().write(data);
InputStream inputStream = connections.getInputStream();
CookieStore cookieJar = manager.getCookieStore();
if (cookieJar != null) {
List<HttpCookie> cookies = cookieJar.getCookies();
for (HttpCookie httpCookie : cookies) {
Log.i("yash", httpCookie.toString());
}
}
connections=(HttpURLConnection)serverURL.openConnection();
//设置cookies管理器
java.net.CookieManager=new java.net.CookieManager();
manager.setCookiePolicy(新CookiePolicy(){
@凌驾
公共布尔值shouldAccept(URI、HttpCookie cookie){
返回cookie.getSecure();
}
});
setDefault(管理器);
connections.setDoInput(true);
连接。设置输出(真);
设置连接超时(超时);
connections.getOutputStream().write(数据);
InputStream InputStream=连接。getInputStream();
CookieStore cookieJar=manager.getCookieStore();
if(cookieJar!=null){
List cookies=cookieJar.getCookies();
用于(HttpCookie HttpCookie:Cookie){
Log.i(“yash”,httpCookie.toString());
}
}
但这没有任何HTTPOnly方法
通过一些谷歌浏览,我发现它有HTTPOnly属性,并且它也观察到了rfc2965。但是为什么谷歌不支持这个RFC6265呢?根据HttpOnly的说法,这个字段只受支持,但由于某些原因,这个字段没有任何访问器或变异器
为了能够访问和修改httpOnly字段,您应该使用反射:
// Workaround httpOnly (getter)
private boolean getHttpOnly() {
try {
Field fieldHttpOnly = cookie.getClass().getDeclaredField("httpOnly");
fieldHttpOnly.setAccessible(true);
return (boolean) fieldHttpOnly.get(cookie);
} catch (Exception e) {
// NoSuchFieldException || IllegalAccessException ||
// IllegalArgumentException
Log.w(TAG, e);
}
return false;
}
// Workaround httpOnly (setter)
private void setHttpOnly(boolean httpOnly) {
try {
Field fieldHttpOnly = cookie.getClass().getDeclaredField("httpOnly");
fieldHttpOnly.setAccessible(true);
fieldHttpOnly.set(cookie, httpOnly);
} catch (Exception e) {
// NoSuchFieldException || IllegalAccessException ||
// IllegalArgumentException
Log.w(TAG, e);
}
}
令人惊讶的是,在Android上没有看到任何解决方案。我看到了一些相互矛盾的信息,关于任何带有httpOnly标志的cookie是否会受到Android浏览器的约束,即使您(从服务器或通过客户端)成功地设置了标志。谷歌自己将Android列为唯一不支持httpOnly的平台,但我不确定该表的日期。嗨,franmontiel,你知道上述反射方式的其他选择吗(因为它在Android Pie中被列入黑名单)?