Servlet会话跟踪和Cookies及HttpSession会话
会话只是指一段指定的时间间隔。
会话跟踪是维护用户状态(数据)的一种方式。它也被称为servlet中的会话管理。
Http协议是一个无状态的,所以我们需要使用会话跟踪技术来维护用户状态。 每次用户请求服务器时,服务器将请求视为新请求。 所以需要保持一个用户的状态来识别特定的用户。
HTTP是无状态的,这意味着每个请求被认为是新的请求。
为什么使用会话跟踪?
- 因为需要用于识别特定的用户。
会话跟踪技术
会话跟踪中使用的技术有四种:
- Cookies
- 隐藏表格域
- 网址重写
- HttpSession
Cookie工作原理
默认情况下,每个请求都被视为新的请求。在cookie技术中,servlet响应可以添加cookie。 所以cookie存储在浏览器的缓存中。之后,如果用户发出请求,默认情况下会带上cookie。 因此,我们就可以知道用户旧用户。
非持久性cookie
- 它仅适用于单个会话。当用户关闭浏览器时都会删除它。
持久性Cookie
- 它对多个会话有效。当用户关闭浏览器时也不会删除它。只有在用户注销或注销时才被删除。
Cookie类
javax.servlet.http.Cookie
类提供了使用Cookie的功能。它为Cookie提供了很多有用的方法
如何创建Cookie?
Cookie ck=new Cookie("user","maxsu jaiswal");//creating cookie object response.addCookie(ck);//adding cookie in the response
如何删除Cookie?
Cookie ck=new Cookie("user","");//deleting value of cookie ck.setMaxAge(0);//changing the maximum age to 0 seconds response.addCookie(ck);//adding cookie in the response
如何获取Cookie?
Cookie ck[]=request.getCookies(); for(int i=0;i<ck.length;i++){ out.print("<br>"+ck[i].getName()+" "+ck[i].getValue());//printing name and value of cookie }
Cookie.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Cookie In Servlet</title>
</head>
<body>
<div style="text-align: center">
<form action="seevlet1" method="post">
用户名:<input type="text" name="username" value="tanlei"/>
<input type="submit" value="提交"/>
</form>
</div>
</body>
</html>
FirstServlet.java
package com.tanlei.cookie; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class FirstServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { resp.setCharacterEncoding("UTF-8"); resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); String name = req.getParameter("username"); String username = new String(name.getBytes("ISO-8859-1"),"utf-8"); out.print("<!DOCTYPE html>\r\n" + "<html>\r\n" + "<head>\r\n" + "<meta charset=\"UTF-8\"><body>"); out.print("欢迎您, " + username); Cookie cookie=new Cookie("uname",username); resp.addCookie(cookie); out.print("<form action='servlet2' method='post'>"); out.print("<p>Cookies已在浏览器中设置,现在跳转到第二个Servlet中读取Cookies的值。</p>"); out.print("<input type='submit' value='提交到第二个Servlet'>"); out.print("</form>"); out.close(); }catch (Exception e){ System.out.println(e); } } }
SecondServlet.java
package com.tanlei.cookie; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; public class SecondServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) { try { response.setCharacterEncoding("UTF-8"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); Cookie ck[] = request.getCookies(); out.print("Hello " + ck[0].getValue()); out.close(); } catch (Exception e) { System.out.println(e); } } }
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <servlet> <servlet-name>FirstServlet</servlet-name> <servlet-class>com.tanlei.cookie.FirstServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>FirstServlet</servlet-name> <url-pattern>/servlet1</url-pattern> </servlet-mapping> <servlet> <servlet-name>SecondServlet</servlet-name> <servlet-class>com.tanlei.cookie.SecondServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SecondServlet</servlet-name> <url-pattern>/servlet2</url-pattern> </servlet-mapping> </web-app>
HttpSession会话