Java 如何解析cookie字符串
我希望获得一个Cookie字符串(因为它可能在一个集合Cookie头中返回),并能够轻松地修改其中的部分内容,特别是过期日期 我看到有几个不同的Cookie类,比如BasicClientCookie,但是我没有看到任何简单的方法将字符串解析为这些对象之一 我看到他们在api级别9中添加了一个解析方法,但我需要一些东西在以前的版本中工作 有什么想法吗Java 如何解析cookie字符串,java,android,string,cookies,Java,Android,String,Cookies,我希望获得一个Cookie字符串(因为它可能在一个集合Cookie头中返回),并能够轻松地修改其中的部分内容,特别是过期日期 我看到有几个不同的Cookie类,比如BasicClientCookie,但是我没有看到任何简单的方法将字符串解析为这些对象之一 我看到他们在api级别9中添加了一个解析方法,但我需要一些东西在以前的版本中工作 有什么想法吗 谢谢我相信您必须手动解析它。试试这个: BasicClientCookie parseRawCookie(String rawCookie) thr
谢谢我相信您必须手动解析它。试试这个:
BasicClientCookie parseRawCookie(String rawCookie) throws Exception {
String[] rawCookieParams = rawCookie.split(";");
String[] rawCookieNameAndValue = rawCookieParams[0].split("=");
if (rawCookieNameAndValue.length != 2) {
throw new Exception("Invalid cookie: missing name and value.");
}
String cookieName = rawCookieNameAndValue[0].trim();
String cookieValue = rawCookieNameAndValue[1].trim();
BasicClientCookie cookie = new BasicClientCookie(cookieName, cookieValue);
for (int i = 1; i < rawCookieParams.length; i++) {
String rawCookieParamNameAndValue[] = rawCookieParams[i].trim().split("=");
String paramName = rawCookieParamNameAndValue[0].trim();
if (paramName.equalsIgnoreCase("secure")) {
cookie.setSecure(true);
} else {
if (rawCookieParamNameAndValue.length != 2) {
throw new Exception("Invalid cookie: attribute not a flag or missing value.");
}
String paramValue = rawCookieParamNameAndValue[1].trim();
if (paramName.equalsIgnoreCase("expires")) {
Date expiryDate = DateFormat.getDateTimeInstance(DateFormat.FULL)
.parse(paramValue);
cookie.setExpiryDate(expiryDate);
} else if (paramName.equalsIgnoreCase("max-age")) {
long maxAge = Long.parseLong(paramValue);
Date expiryDate = new Date(System.getCurrentTimeMillis() + maxAge);
cookie.setExpiryDate(expiryDate);
} else if (paramName.equalsIgnoreCase("domain")) {
cookie.setDomain(paramValue);
} else if (paramName.equalsIgnoreCase("path")) {
cookie.setPath(paramValue);
} else if (paramName.equalsIgnoreCase("comment")) {
cookie.setPath(paramValue);
} else {
throw new Exception("Invalid cookie: invalid attribute name.");
}
}
}
return cookie;
}
BasicClientCookie parseRawCookie(字符串rawCookie)引发异常{
字符串[]rawCookieParams=rawCookie.split(“;”);
字符串[]rawCookieNameAndValue=rawCookieParams[0]。拆分(“”);
if(rawCookieNameAndValue.length!=2){
抛出新异常(“无效cookie:缺少名称和值”);
}
字符串cookieName=rawCookieNameAndValue[0].trim();
字符串cookieValue=rawCookieNameAndValue[1].trim();
BasicClient cookie cookie=新的BasicClient cookie(cookieName,cookieValue);
for(int i=1;i
我还没有编译或运行这段代码,但这应该是一个良好的开端。您可能需要稍微处理一下日期解析:我不确定cookies中使用的日期格式是否与DateFormat.FULL
中的日期格式相同。(查看相关问题,其中涉及处理cookie中的日期格式。)此外,请注意,有些cookie属性不是由BasicClientCookie
处理的,例如version
和httponly
最后,这段代码假设cookie的名称和值作为第一个属性出现:我不确定这是否一定是真的,但我见过的每个cookie都是这样排序的。使用正则表达式,如:
([^=]+)=([^\;]+);\s?
您可以像这样解析cookie:
.COOKIEAUTH=5DEF0BF530F749AD46F652BDF31C372526A42FEB9D40162167CB39C4D43FC8AF1C4B6DF0C24ECB1945DFF7952C70FDA1E4AF12C1803F9D089E78348C4B41802279897807F85905D6B6D2D42896BA2A267E9F564814631B4B31EE41A483C886B14B5A1E76FD264FB230E87877CB9A4A2A7BDB0B0101BC2C1AF3A029CC54EE4FBC;
expires=Sat, 30-Jul-2011 01:22:34 GMT;
path=/; HttpOnly
只需几行代码。您就可以使用ApacheHttpClient的工具来实现这一点。以下是一段摘录:
CookieSpec CookieSpec=new BrowserCompatSpec();
ListParseCookie(URI、ListCookieHeaders){
ArrayList cookies=新的ArrayList();
int-port=(uri.getPort()<0)?80:uri.getPort();
boolean secure=“https.”等于(uri.getScheme());
CookieOrigin=新的CookieOrigin(uri.getHost(),端口,
uri.getPath(),secure);
for(字符串cookieHeader:cookieHeaders){
BasicHeader header=新BasicHeader(SM.SET_COOKIE,cookieHeader);
试一试{
addAll(cookieSpec.parse(header,origin));
}捕获(格式错误的Okiee异常){
法律博士(e);
}
}
归还饼干;
}
Yanchenko使用ApacheHTTP客户端的方法的优点是,它根据源代码验证与规范一致的cookie。正则表达式方法不会做到这一点,但您可能不需要这样做
public class CookieUtil {
public List<Cookie> parseCookieString(String cookies) {
List<Cookie> cookieList = new ArrayList<Cookie>();
Pattern cookiePattern = Pattern.compile("([^=]+)=([^\\;]*);?\\s?");
Matcher matcher = cookiePattern.matcher(cookies);
while (matcher.find()) {
int groupCount = matcher.groupCount();
System.out.println("matched: " + matcher.group(0));
for (int groupIndex = 0; groupIndex <= groupCount; ++groupIndex) {
System.out.println("group[" + groupIndex + "]=" + matcher.group(groupIndex));
}
String cookieKey = matcher.group(1);
String cookieValue = matcher.group(2);
Cookie cookie = new BasicClientCookie(cookieKey, cookieValue);
cookieList.add(cookie);
}
return cookieList;
}
}
公共类CookieUtil{
公共列表parseCookieString(字符串cookies){
List-cookieList=new-ArrayList();
Pattern cookiePattern=Pattern.compile(([^=]+)=([^\\;]*);?\\s?);
Matcher Matcher=cookiePattern.Matcher(cookies);
while(matcher.find()){
int groupCount=matcher.groupCount();
System.out.println(“匹配:+matcher.group(0));
对于(int groupIndex=0;groupIndex
List cookies=HttpCookie.parse(头);
很有趣,但是java.net.HttpCookie
类无法解析带有域和/或路径部分的cookie字符串,而这正是java.net.HttpCookie
类转换为字符串的部分
例如:
HttpCookie newCookie = new HttpCookie("cookieName", "cookieValue");
newCookie.setDomain("cookieDomain.com");
newCookie.setPath("/");
由于此类既不实现可序列化也不实现可打包,因此很容易将Cookie存储为字符串
saveMyCookieAsString(newCookie.toString());
此语句将以以下格式保存cookie:
cookieName="cookieValue";$Path="/";$Domain="cookiedomain.com"
然后你想还原这个cookie,所以你得到了字符串:
String cookieAsString = restoreMyCookieString();
并尝试解析它:
List<HttpCookie> cookiesList = HttpCookie.parse(cookieAsString);
StringBuilder myCookieAsStringNow = new StringBuilder();
for(HttpCookie httpCookie: cookiesList) {
myCookieAsStringNow.append(httpCookie.toString());
}
域和路径部分刚刚消失。原因:解析方法对“域”和“路径”等词区分大小写。
可能的解决方法:提供另一个toString()方法,如:
public static String httpCookieToString(HttpCookie httpCookie) {
StringBuilder result = new StringBuilder()
.append(httpCookie.getName())
.append("=")
.append("\"")
.append(httpCookie.getValue())
.append("\"");
if(!TextUtils.isEmpty(httpCookie.getDomain())) {
result.append("; domain=")
.append(httpCookie.getDomain());
}
if(!TextUtils.isEmpty(httpCookie.getPath())){
result.append("; path=")
.append(httpCookie.getPath());
}
return result.toString();
}
我觉得它很有趣(特别是像java.net.HttpCookie
这样的类,它们的目标是被越来越多的人使用),我希望它对某些人有用。CookieManager CookieManager=new CookieManager();
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);
HttpCookie cookie = new HttpCookie("lang", "en");
cookie.setDomain("Your URL");
cookie.setPath("/");
cookie.setVersion(0);
cookieManager.getCookieStore().add(new URI("https://Your URL/"), cookie);
List<HttpCookie> Cookies = cookieManager.getCookieStore().get(new URI("https://Your URL/"));
String s = Cookies.get(0).getValue();
setDefault(cookieManager);
HttpCookie cookie=新Http
cookieName=cookieValue
public static String httpCookieToString(HttpCookie httpCookie) {
StringBuilder result = new StringBuilder()
.append(httpCookie.getName())
.append("=")
.append("\"")
.append(httpCookie.getValue())
.append("\"");
if(!TextUtils.isEmpty(httpCookie.getDomain())) {
result.append("; domain=")
.append(httpCookie.getDomain());
}
if(!TextUtils.isEmpty(httpCookie.getPath())){
result.append("; path=")
.append(httpCookie.getPath());
}
return result.toString();
}
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);
HttpCookie cookie = new HttpCookie("lang", "en");
cookie.setDomain("Your URL");
cookie.setPath("/");
cookie.setVersion(0);
cookieManager.getCookieStore().add(new URI("https://Your URL/"), cookie);
List<HttpCookie> Cookies = cookieManager.getCookieStore().get(new URI("https://Your URL/"));
String s = Cookies.get(0).getValue();
val headers = ..........
val headerBuilder = Headers.Builder()
headers?.forEach {
val values = it.split(";")
values.forEach { v ->
if (v.contains("=")) {
headerBuilder.add(v.replace("=", ":"))
}
}
}
val headers = headerBuilder.build()