На днях я исправлял очень сложную ошибку, связанную с некоторыми липкими сессионными cookie-файлами и несколькими обратными прокси-серверами. В процессе устранения ошибок я обнаружил, что мне нужно проанализировать строки заголовка set-cookie и выполнить некоторую фильтрацию значений в одном из наших обратных прокси-серверов.
Моя первая идея заключалась в том, чтобы написать какое-то регулярное выражение, которое бы анализировало строку и получало желаемые значения. Я пошел примерно так:
(.*?)=(.*?)($|;|,(?! ))
Вот ссылка на регулярное выражение.
Оказывается, это сложнее, чем простое регулярное выражение. Одна строка может содержать несколько файлов cookie, необязательные параметры и т. Д. Тогда возникает проблема с несколькими форматами того, как может выглядеть строка cookie. Мне нужно было бы написать много логики вокруг моего регулярного выражения.
Естественно, я немного поленился, поэтому начал изучать, что может предложить Java. Для этого должно быть существующее решение. Я нашел класс с именем HttpCookie
.
Использование очень простое:
List<HttpCookie> cookies = HttpCookie.parse(cookie);
Он проанализирует все файлы cookie в строке на набор объектов, содержащих всю необходимую информацию.
private final String name; // NAME= ... "$Name" style is reserved private String value; // value of NAME // Attributes encoded in the header's cookie fields. private String comment; // Comment=VALUE ... describes cookie's use private String commentURL; // CommentURL="http URL" ... describes cookie's use private boolean toDiscard; // Discard ... discard cookie unconditionally private String domain; // Domain=VALUE ... domain that sees cookie private long maxAge = MAX_AGE_UNSPECIFIED; // Max-Age=VALUE ... cookies auto-expire private String path; // Path=VALUE ... URLs that see the cookie private String portlist; // Port[="portlist"] ... the port cookie may be returned to private boolean secure; // Secure ... e.g. use SSL private boolean httpOnly; // HttpOnly ... i.e. not accessible to scripts private int version = 1; // Version=1 ... RFC 2965 style
Это сэкономило мне много времени.
Первоначально опубликовано на https://ppolivka.com.