Главная » Java, Web » Работа с Cookies

0

Cookies — это небольшие фрагменты текстовой информации, которую посылает Web-cepeep браузеру, а браузер, когда вновь отображает сайт, возвращает их в первоначальном виде серверу. Cookies используются для решения нескольких типичных задач.

?   Идентификация пользователя на протяжении сессии.

Особенно полезно производить идентификацию сессий на сайтах, занимающихся электронной коммерцией.

?   Можно обходиться без имени пользователя и пароля.

Cookies предоставляют альтернативу: если не требуется высокий уровень безопасности, то вместо паролей можно использовать Cookies.

?   Организация сайта в соответствии с пользовательскими предпочтениями.

Сайт может предлагать производить пользовательскую настройку. Параметры настройки можно передавать в виде Cookies.

?   Целенаправленная реклама.

Cookies могут быть использованы для того, чтобы производить выбор отправляемых баннеров в соответствии с пользовательскими предпочтениями, которые передаются посредством Cookies.

Cookies вполне безопасны. Информация, передаваемая в виде Cookies, никак не может быть использована не по назначению. Cookies никогда никоим образом не интерпретируются, не выполняются, соответственно, они не могут нести в себе вирусов. Помимо этого установлено, что браузер может принимать не более 20 Cookies для каждого сайта, общее количество Cookies не может превышать 300, размер для каждого фрагмента Cookie установлен не более 4 Кбайт. Следовательно, Cookies не смогут занять сколь-либо значительного места на жестком диске и производить какие-либо хакерские атаки.

API для работы с Cookies

Прежде чем послать Cookies клиенту, необходимо создать один или несколько Cookies, указав их имена и задав значения. При этом используется метод cookie (name, value). Дополнительные атрибуты задаются при помощи cookie. setXxx. Заголовок ответа, содержащего cookie, формируется в сервлете с применением метода response.addcookie (cookie). Для чтения возвращаемых клиентом Cookies используется метод request. getcookies о . Этот метод возвращает массив объектов типа cookie. Как правило, затем объект просматривается с целью нахождения нужного cookie, для этого используется метод getName, значение cookie может быть получено с применением метода getValue.

Как создать Cookies

Cookie можно создать при помощи конструктора cookie, которому передается два параметра — имя cookie и значение cookie (оба представляют собой строки). Имя и значение не могут содержать символов пробелов, а также символов: [ ] ()=,"/?(?:;

Задание атрибутов для Cookies

Прежде чем вставить cookies в заголовок, нужно задать атрибуты. При работе с cookies используются следующие атрибуты (указаны соответствующие методы задания значений атрибутов).

?   getComment/setComment Устанавливает/получает комментарий для cookie.

?   getDomain/setDomain

Устанавливает/получает домен, для которого предназначен cookie. Домен должен начинаться с точки (например, .e-olymp.com). Для доменов, не относящихся к странам (например, .com, .edu), точек должно быть две, для доменов стран (например, .spb.ru, .edu.es) точек должно быть три.

?   getMaxAge/setMaxAge

Устанавливает/получает промежуток времени в секундах до истечения срока годности cookie. Если это значение не установлено, то cookie годятся только для текущей сессии.

?   getName/setName Устанавливает/читает имя cookie.

?   getPath/setPath

Устанавливает/получает путь, к которому относится cookie. Если путь не указан, то cookie возвращается ко всем URL, расположенным в том же директории, что и текущая страница. Этот метод может быть использован для идентификации с применением cookie самых общих свойств. В частности, метод someCookie . set Path ( "/") устанавливает, ЧТО Cookie должны возвращаться для всех страниц сервера. Путь должен содержать текущий каталог.

?   getSecure/setSecure

Устанавливает и читает значение Boolean. В соответствии с ним cookie могут быть посланы только по зашифрованному каналу SSL или нет.

?   getValue/setValue Устанавливает/получает значение для cookie.

?   getVersion/setVersion Устанавливает/получает версию протокола для cookie.

Вставка Cookie в заголовок ответа

Вставка Cookie в заголовок HTTP-ответа происходит с помощью метода addCookie (интерфейс HttpServletResponse). Например:

Cookie userCookie = new Cookie("user", "uidl234"); response.addCookie(userCookie);

Чтение Cookie, полученного от клиента

Чтобы направить клиенту Cookie, необходимо создать cookie при помощи метода addCookie и послать его в заголовке методом response.addCookie (). Для чтения Cookie используется метод getcookies интерфейса HttpServletRequest. Метод возвращает массив объектов типа cookie. К нему можно применить метод getName. По совпадающему имени можно получить значение с использованием метода getvaiue.

Утилиты для работы с Cookies

Файл ServletUtilities.java содержит описание утилит, упрощающих работу с Cookies (листинг 4.17).

j Листинг 4.17. Фрагмент файла ServletUtilities.java                                                                     )

public static String getCookieValue(Cookie[] cookies,

String cookieName, String defaultValue) { for(int i=0; iccookies.length; i++) { Cookie cookie = cookies[i]; if (cookieName.equals(cookie.getName())) return(cookie.getValue());

}

return(defaultValue);

Файл LongLivedCookie.java (листинг 4.18) содержит класс, предназначенный для работы с cookies. Срок жизни для cookie устанавливается равным одному году.

Листинг 4.18. Файл LongLivedCookie.java

package hall;

import javax.servlet.http.*;

public class LongLivedCookie extends Cookie {

public static final int SECONDS_PER_YEAR = 60*60*24*365; public LongLivedCookie(String name, String value) { super(name, value); setMaxAge(SECONDS_PER_YEAR);

В качестве примера рассмотрим файл SearchEnginesFrontEnd.java (листинг 4.19). В коде использован метод getCookieValue. Метод headWithTitle создает фрагмент генерируемого HTML-кода. В примере используется класс

LongLivedCookie (листинг 4.18).

Листинг 4.19. Файл SearchEnginesFrontEnd.java.

package paket; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; impo rt j ava.net.*;

public class SearchEnginesErontEnd extends HttpServlet { public void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

Cookie[] cookies = request.getCookies();

String searchString =

ServletUtilities.getCookieValue(cookies,

"searchString", "Java Programming");

String numResults =

ServletUtilities.getCookieValue(cookies,

"numResults", "10");

String searchEngine =

ServletUtilities.getCookieValue(cookies,

"searchEngine", "google");

response.setContentType("text/html");

PrintWriter out = response.getWriter();

String title = "Searching the Web";

out.println(ServletUtilities.headWithTitle(title) +

"<BODY BGC0L0R=\"#FDF5E6\">\n" +

"<H1 ALIGN=\"CENTER\">Searching the Web</Hl>\n" + "\n" +

"<FORM ACTION=\"http://localhost:81/dosearch">\n" + "<CENTER>\n" + "Search String:\n" +

"<INPUT TYPE=\"TEXT\" NAME=\"searchString\"\n" + VALUE=\"" + searchString + "\"><BR>\n" + "Results to Show Per Page:\n" + "CINPUT TYPE=\"TEXT\" NAME=\"numResults\"\n" +

VALUE=" + numResults + " SIZE=3><BR>\n" + "<INPUT TYPE=\"RADIO\" NAME=\"searchEngine\"\n" +

VALUE=\"google\"" + checked("google", searchEngine) + ">\n" + "Google |\n" +

"<INPUT TYPE=\"RADIO\" NAME=\"searchEngine\"\n" +

VALUE=\"infoseek\"" + checked("infoseek", searchEngine) + ">\n" + "Infoseek |\n" +

"<INPUT TYPE=\"RADIO\" NAME=\"searchEngine\"\n" +

VALUE=\"lycos\"" + checked("lycos", searchEngine) + ">\n" + "Lycos |\n" +

"<INPUT TYPE=\"RADIO\" NAME=\"searchEngine\"\n" +

VALUE=\"hotbot\"" + checked("hotbot", searchEngine) + ">\n" + "HotBot\n" + "<BR>\n" +

"<INPUT TYPE=\"SUBMIT\" VALUE=\"Search\">\n" + "</CENTER>\n" + "</FORM>\n" + "\n" +

"</BODY>\n" + "</HTML>\n");

}

private String checked(String namel, String name2) { if (namel.equals(name2))

return(" CHECKED"); else

return ("");

}

В этом случае фронт-энд (внешний вид) (рис. 4.17) формируется с помощью файла SearchEnginesFrontEnd.java. Этот сервлет (буцем вызывать его по адресу http://localhost:81/frontend) посылает собранную информацию другому сервлету (рис. 4.18), код которого расположен в файле CustomizedSearch- Engines.java (листинг 4.20), а адрес которого http://localhost:81/dosearch.

Рис. 4.17. Фронт-энд поискового сервлета

Листинг 4.20. Файл CustomizedSearchEngines.java

package paket; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; impo rt j ava.net.*;

public class CustomizedSearchEngines extends HttpServlet {

public void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

String searchString = request.getParameter("searchString"); Cookie searchStringCookie =

new LongLivedCookie("searchString", searchString); response.addCookie(searchStringCookie); searchString = URLEncoder.encode(searchString); String numResults = request.getParameter("numResults"); Cookie numResultsCookie =

new LongLivedCookie("numResults", numResults); response.addCookie(numResultsCookie);

String searchEngine = request.getParameter("searchEngine"); Cookie searchEngineCookie =

new LongLivedCookie("searchEngine", searchEngine); response.addCookie(searchEngineCookie); SearchSpec[] commonSpecs = SearchSpec.getCommonSpecs(); for(int i=0; iccommonSpecs.length; i++) { SearchSpec searchSpec = commonSpecs[i]; if (searchSpec.getName().equals(searchEngine)) { String url =

searchSpec.makeURL(searchString, numResults); response.sendRedirect(url); return;

}

}

response.sendError(response.SC_NOT_EOUND,

"No recognized search engine specified.");

}

public void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException { doGet(request, response);

Рис. 4.18. Запрос выполнен

Источник: Будилов В. А. Интернет-программирование на Java. — СПб.: БХВ-Петербург, 2003. — 704 е.: ил.

По теме:

  • Комментарии