На днях я исправлял очень сложную ошибку, связанную с некоторыми липкими сессионными 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.