- Обработка файлов cookie и сеанс в сервлете Java
- 2. Основы cookie
- 2.1. Создать файл cookie
- 2.2. Установите дату истечения срока действия файлов cookie
- 2.3. Установите домен cookie
- 2.4. Установить путь для файлов cookie
- 2.5. Читать файлы cookie в сервлете
- 2.6. Удалить файл cookie
- 3. HttpSession Объект
- 3.1. Получение сеанса
- 3.2. АтрибутыSession
- 4. Заключение
- Java Cookies: How to do Java Servlet Session Management using Cookies
- 1. crunchify-login.html
- 2. CrunchifyLoginServlet.java
- 3. CrunchifyLogoutServlet.java
- 4. web.xml
- 5. CrunchifyLoginSuccessful.jsp
- Hi , Login successful.
- Now let’s run this example:
Обработка файлов cookie и сеанс в сервлете Java
В этом руководстве мы рассмотримthe handling of cookies and sessions in Java, using Servlets.
Кроме того, мы кратко опишем, что такое файл cookie, и рассмотрим несколько примеров его использования.
2. Основы cookie
Проще говоря,a cookie is a small piece of data stored on the client-side which servers use when communicating with clients.
They’re used to identify a client при отправке последующего запроса. Их также можно использовать для передачи некоторых данных из одного сервлета в другой.
Для получения дополнительных сведений см.to this article.
2.1. Создать файл cookie
КлассCookie определен в пакетеjavax.servlet.http.
Чтобы отправить его клиенту, нам нужноcreate one and add it to the response:
Cookie uiColorCookie = new Cookie("color", "red"); response.addCookie(uiColorCookie);
Однако его API намного шире — давайте рассмотрим его.
2.2. Установите дату истечения срока действия файлов cookie
Мы можем установить максимальный возраст (с помощью методаmaxAge(int)), который определяет, сколько секунд данный файл cookie должен быть действителен в течение:
uiColorCookie.setMaxAge(60*60);
Мы устанавливаем максимальный возраст до одного часа. По истечении этого времени файл cookie не может использоваться клиентом (браузером) при отправке запроса, и его также следует удалить из кэша браузера.
2.3. Установите домен cookie
Еще один полезный метод в APICookie —setDomain(String).
Это позволяет нам указывать доменные имена, на которые оно должно быть доставлено клиентом. Это также зависит от того, явно ли мы указываем доменное имя или нет.
Установим домен для cookie:
uiColorCookie.setDomain("example.com");
Файл cookie будет доставлен на каждый запрос, сделанныйexample.com и его поддоменами.
If we don’t specify a domain explicitly, it will be set to the domain namewhich created a cookie.
Например, если мы создадим cookie изexample.com и оставим имя домена пустым, то он будет доставлен вwww.example.com (без поддоменов).
Наряду с доменным именем, мы также можем указать путь. Давайте посмотрим на это дальше.
2.4. Установить путь для файлов cookie
Путь указывает, куда будет доставлен файл cookie.
Если мы укажем путь явно, тоCookie будет доставлен по данному URL-адресу и всем его подкаталогам:
uiColorCookie.setPath("/welcomeUser");
Неявно будет установлен URL, по которому был создан файл cookie, и все его подкаталоги.
Теперь давайте сосредоточимся на том, как мы можем получить их значения внутриServlet.
2.5. Читать файлы cookie в сервлете
Файлы cookie добавляются в запрос клиентом. Клиент проверяет свои параметры и решает, сможет ли он доставить его по текущему URL.
Мы можем получить все файлы cookie, вызвавgetCookies() по запросу (HttpServletRequest), переданному кServlet.
Мы можем перебирать этот массив и искать тот, который нам нужен, например, сравнивая их имена:
public Optional readCookie(String key) < return Arrays.stream(request.getCookies()) .filter(c ->key.equals(c.getName())) .map(Cookie::getValue) .findAny(); >
2.6. Удалить файл cookie
Toremove a cookie from a browser, we have to add a new one to the response with the same name, but with a maxAge value set to 0:
Cookie userNameCookieRemove = new Cookie("userName", ""); userNameCookieRemove.setMaxAge(0); response.addCookie(userNameCookieRemove);
Пример использования для удаления файлов cookie — это действие по выходу пользователя из системы — нам может потребоваться удалить некоторые данные, которые были сохранены для активного сеанса пользователя.
Теперь мы знаем, как обрабатывать файлы cookie внутриServlet.
Далее мы рассмотрим другой важный объект, к которому мы очень часто обращаемся из объектаServlet — объектаSession.
3. HttpSession Объект
HttpSession — еще один вариант для хранения пользовательских данных по разным запросам. Сеанс — это серверное хранилище, содержащее контекстные данные.
Данные не разделяются между различными объектами сеанса (клиент может получить доступ к данным только из своего сеанса). Он также содержит пары ключ-значение, но по сравнению с файлом cookie сеанс может содержать объект в качестве значения. Механизм реализации хранилища зависит от сервера.
Сеанс сопоставляется с клиентом с помощью файла cookie или параметров запроса. Более подробную информацию можно найтиhere.
3.1. Получение сеанса
Мы можем получитьHttpSession прямо из запроса:
HttpSession session = request.getSession();
Приведенный выше код создаст новый сеанс, если он не существует. Мы можем достичь того же, позвонив:
В случае, если мы просто хотим получить существующий сеанс, а не создавать новый, нам нужно использовать:
Если мы обращаемся к странице JSP в первый раз, то по умолчанию создается новый сеанс. Мы можем отключить это поведение, установив атрибутsession наfalse:
В большинстве случаев веб-сервер использует файлы cookie для управления сеансами. Когда создается объект сеанса, сервер создает файл cookie с ключом и значениемJSESSIONID, который идентифицирует сеанс.
3.2. АтрибутыSession
Объект сеанса предоставляет набор методов для доступа (создания, чтения, изменения, удаления) к атрибутам, созданным для данного сеанса пользователя:
- setAttribute(String, Object), который создает или заменяет атрибут сеанса ключом и новым значением
- getAttribute(String), который читает значение атрибута с заданным именем (ключом)
- removeAttribute(String), который удаляет атрибут с заданным именем
Мы также можем легко проверить уже существующие атрибуты сеанса, вызвавgetAttributeNames().
Как мы уже упоминали, мы можем извлечь объект сеанса из запроса. Когда у нас уже есть это, мы можем быстро выполнить методы, упомянутые выше.
HttpSession session = request.getSession(); session.setAttribute("attributeKey", "Sample Value");
Значение атрибута можно получить по его ключу (имени):
session.getAttribute("attributeKey");
Мы можем удалить атрибут, когда он нам больше не нужен:
session.removeAttribute("attributeKey");
Хорошо известным вариантом использования пользовательского сеанса является аннулирование всех данных, которые он сохраняет, когда пользователь выходит из нашего веб-сайта. Объект сеанса предоставляет решение для этого:
Этот метод удаляет весь сеанс с веб-сервера, поэтому мы больше не можем получить доступ к атрибутам с него.
У объектаHttpSession больше методов, но тот, который мы упомянули, является наиболее распространенным.
4. Заключение
В этой статье мы рассмотрели два механизма, которые позволяют нам хранить пользовательские данные между последующими запросами к серверу — cookie и сеанс.
Имейте в виду, что протокол HTTP не имеет состояния, поэтому поддержание состояния между запросами является обязательным.
Как всегда доступны фрагменты кодаover on Github.
Java Cookies: How to do Java Servlet Session Management using Cookies
Web Pages have no memories. A user going from page to page will be treated by the website as a completely new visitor. Session cookies enable the website you are visiting to keep track of your movement from page to page so you don’t get asked for the same information you’ve already given to the site.
Cookies allow you to proceed through many pages of a site quickly and easily without having to authenticate or reprocess each new area you visit.
But sometimes in Java web applications, we should know who the client is and process the request accordingly.
For example, a shopping cart application should know who is sending the request to add an item and in which cart the item has to be added or who is sending checkout request so that it can charge the amount to correct client.
Session is a conversational state between client and server and it can consists of multiple request and response between client and server. Since HTTP and Web Server both are stateless, the only way to maintain a session is when some unique information about the session (session id) is passed between server and client in every request and response.
Now let’s create Simple Dynamic Web Project in Eclipse which explains Java Servlet Session Management using Cookies.
Here are the steps:
- Create Dynamic Web Project: CrunchifySessionManagementByCookie
- crunchify-login.html : Create welcome page of an application
- CrunchifyLoginServlet.java – That takes care of the Login request
- CrunchifyLogoutServlet.java – That takes care of the Logout request
- web.xml – Deployment Descriptor File (Don’t see web.xml? Follow this tutorial)
- CrunchifyLoginSuccessful.jsp – Success Request is being are forwarded to LoginSuccess.jsp , this cookie will be used there to track the session. Also notice that cookie timeout is set to 60 minutes.
Another must read:
1. crunchify-login.html
Enter Your Username:
Enter Your Password:
2. CrunchifyLoginServlet.java
package com.crunchify.tutorials; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /* * Author: Crunchify.com * */ /** * Servlet implementation class LoginServlet */ @WebServlet("/CrunchifyLoginServlet") public class CrunchifyLoginServlet extends HttpServlet < private static final long serialVersionUID = 1L; private final String userID = "CrunchifyUser"; private final String password = "CrunchifyPassword"; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < // get request parameters for userID and password String crunchifyUser = request.getParameter("crunchifyUser"); String pwd = request.getParameter("crunchifyPassword"); if (userID.equals(crunchifyUser) && password.equals(pwd)) < Cookie crunchifyCookie = new Cookie("crunchifyUser", crunchifyUser); // setting cookie to expiry in 60 mins crunchifyCookie.setMaxAge(60 * 60); response.addCookie(crunchifyCookie); response.sendRedirect("CrunchifyLoginSuccess.jsp"); >else < RequestDispatcher rd = getServletContext().getRequestDispatcher("/crunchify-login.html"); PrintWriter out = response.getWriter(); out.println("Please make sure you enter UserID/Pass as \"CrunchifyUser : CrunchifyPassword\".\n"); rd.include(request, response); > > >
3. CrunchifyLogoutServlet.java
package com.crunchify.tutorials; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /* * Author: Crunchify.com * */ /** * Servlet implementation class LogoutServlet */ @WebServlet("/CrunchifyLogoutServlet") public class CrunchifyLogoutServlet extends HttpServlet < private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < response.setContentType("text/html"); Cookie loginCookie = null; Cookie[] cookies = request.getCookies(); if (cookies != null) < for (Cookie cookie : cookies) < if (cookie.getName().equals("crunchifyUser")) < loginCookie = cookie; break; >> > if (loginCookie != null) < loginCookie.setMaxAge(0); response.addCookie(loginCookie); >response.sendRedirect("crunchify-login.html"); > >
4. web.xml
CrunchifySessionManagementByCookie crunchify-login.html
5. CrunchifyLoginSuccessful.jsp
> if (userName == null) response.sendRedirect("crunchify-login.html"); %>Hi , Login successful.
Now let’s run this example:
- Deploy CrunchifySessionManagementByCookie Project to Tomcat and Run Tomcat.
- Point your browser URL to http://localhost:8080/CrunchifySessionManagementByCookie/crunchify-login.html
- Success Page
- Failed Login Page
Now How to Check If you Cookie is correctly set.
Try downloading any Cookie Manager Extension and you should see Cookie in your browser as seen below.
Let me know if you face any issue running above Servlet Cookie Management code.
If you liked this article, then please share it on social media. Have a question or suggestion? Please leave a comment to start the discussion.