文章目录
- Cookie
- 创建Cookie
- 获取Cookie
- 更新Cookie
- Cookie 生命控制
- Cookie 有效路径
- Session 会话
- 创建和获取session
- Session 域数据的存取
- Session 生命周期控制
- 浏览器和 Session 之间关联
Cookie
Cookie 是服务器通知客户端保存键值对的一种技术,客户端有了 Cookie 后,每次请求都发送给服务器并且每个 Cookie 的大小不能超过 4kb。
创建Cookie
- 创建一个新的servlet程序CookieServlet
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;public class CookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");//1 创建Cookie 对象Cookie cookie = new Cookie("username", "root");//2 通知客户端保存Cookieresp.addCookie(cookie);//1 创建Cookie 对象Cookie cookie1 = new Cookie("password", "123456");//2 通知客户端保存Cookieresp.addCookie(cookie1);resp.getWriter().write("Cookie 创建成功");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
- 增加新的映射文件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"><servlet><servlet-name>CookieServlet</servlet-name><servlet-class>CookieServlet</servlet-class></servlet><servlet-mapping><servlet-name>CookieServlet</servlet-name><url-pattern>/createCookie</url-pattern></servlet-mapping>
</web-app>
- 启动服务器,测试cookie是否创建成功,http://localhost:8080/javaee_tomcat_war_exploded/createCookie
按F12,或者鼠标右击检查,选择应用程序,点开Cookie,查看到对应信息
获取Cookie
- 创建一个工具类用来获取Cookie信息CookieUtils
import javax.servlet.http.Cookie;public class CookieUtils {/*** 查找指定名称的Cookie 对象** @param name* @param cookies* @return*/public static Cookie findCookie(String name, Cookie[] cookies) {if (name == null || cookies == null || cookies.length == 0) {return null;}for (Cookie cookie : cookies) {if (name.equals(cookie.getName())) {return cookie;}}return null;}}
- 创建一个新的servlet用来获取到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;public class getCookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");Cookie[] cookies = req.getCookies();for (Cookie cookie : cookies) {// getName 方法返回Cookie 的key(名)// getValue 方法返回Cookie 的value 值resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "] <br/>");}Cookie mycookie = CookieUtils.findCookie("username", cookies);// 如果不等于null,说明赋过值,也就是找到了需要的Cookieif (mycookie != null) {resp.getWriter().write("找到了需要的 Cookie");}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
- 新增对应的映射文件信息
<?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"><servlet><servlet-name>getCookieServlet</servlet-name><servlet-class>getCookieServlet</servlet-class></servlet><servlet-mapping><servlet-name>getCookieServlet</servlet-name><url-pattern>/getCookie</url-pattern></servlet-mapping>
</web-app>
- 启动项目进行访问。
http://localhost:8080/javaee_tomcat_war_exploded/getCookie
这里我们直接获取到了cookie信息,这是因为我们之前的程序中存放了对应的cookie信息,如果我们换一个浏览器进行访问就访问不到之前的cookie信息了,这时我们可以重新调用一下http://localhost:8080/javaee_tomcat_war_exploded/createCookie这个请求,再获取cookie。
更新Cookie
更新cookie有俩种方法:
- 先创建一个要修改的同名(指的就是 key)的 Cookie 对象,在构造器,同时赋于新的 Cookie 值,最后调用 response.addCookie( Cookie );
- 先查找到需要修改的 Cookie 对象,调用 setValue()方法赋于新的 Cookie 值,调用 response.addCookie()通知客户端保存修改。
Cookie 生命控制
管理 Cookie 什么时候被销毁(删除)
通过Cookie对象中的setMaxAge()来控制Cookie的声明周期。
- 正数,表示在指定的秒数后过期,
cookie.setMaxAge(60 * 60);
表示一小时后cookie失效 - 负数,表示浏览器一关,Cookie 就会被删除(默认值是-1),
cookie.setMaxAge(-1);
表示浏览器一关cookie就会失效 - 零,表示马上删除 Cookie,
cookie.setMaxAge(-1);
表示cookie马上就会失效。
Cookie 有效路径
Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器。哪些不发。
-
cookie.setPath( req.getContextPath() + "/abc" ); 表示工程路径/abc路径下面的可以获取到cookie信息。
Session 会话
Session 就是一个接口(HttpSession),作为一个会话,它是用来维护一个客户端和服务器之间关联的一种技术。每个客户端都有自己的一个 Session 会话。
创建和获取session
通过HttpServletRequest中的getSession()方法来创建一个session对象,之后使用该方法都是获取到之前创建的session对象。
isNew()
: 判断到底是不是刚创建出来的(新的)getId()
: 得到 Session 的会话 id 值。
Session 域数据的存取
- 定义俩个servlet程序,一个用来存入数据,一个用来取出数据
SessionServlet类
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class SessionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();session.setAttribute("username","xiaoming");session.setAttribute("password","123456");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
getSessionServlet类
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class getSessionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();String username = (String) session.getAttribute("username");String password = (String) session.getAttribute("password");System.out.println("用户名:" + username + ",密码:" + password);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
- 创建对应的映射文件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"><servlet><servlet-name>SessionServlet</servlet-name><servlet-class>SessionServlet</servlet-class></servlet><servlet-mapping><servlet-name>SessionServlet</servlet-name><url-pattern>/createSession</url-pattern></servlet-mapping><servlet><servlet-name>getSessionServlet</servlet-name><servlet-class>getSessionServlet</servlet-class></servlet><servlet-mapping><servlet-name>getSessionServlet</servlet-name><url-pattern>/getSession</url-pattern></servlet-mapping>
</web-app>
- 启动服务进行测试,先输入这个网站http://localhost:8080/javaee_tomcat_war_exploded/createSession进行数据的请求,再输入http://localhost:8080/javaee_tomcat_war_exploded/getSession进行数据获取。
Session 生命周期控制
- 通过HttpSession对象中的setMaxInactiveInterval()来设置 Session 的超时时间(以秒为单位)。
- 值为正数的时候: 设定 Session 的超时时长。
- 值为负数的时候: 永不超时
- 通过getMaxInactiveInterval()方法来获取 Session 的超时时间
- 通过invalidate()来让当前Session会话马上失效
- Session 默认的超时时间长为 30 分钟。这个是tomcat中的默认配置。这个设置可以进行修改
<!--表示当前web 工程。创建出来的所有Session 默认是20 分钟超时时长-->
<session-config><session-timeout>20</session-timeout>
</session-config>
浏览器和 Session 之间关联
Session 技术,底层其实是基于 Cookie 技术来实现的。
- 当浏览器没有任何Cookie信息的时候,发请求到tomcat服务器时调用了HttpServletRequest对象的getSession()方法,这时服务器会创建一个Cookie对象,这个Cookie对象的key为JSESSIONID,值为新创建出来的Sessino的id值。
- 通过响应将该值传递给客户端,之后客户端每次请求的时候就会将id以Cookie的形式发送给服务器端。
- 服务器再获取HttpSession对象的时候就会通过Cookie中的id值来找到自己之前创建的Seesion对象。
欢迎java热爱者了解文章,作者将会持续更新中,期待各位友友的关注和收藏,另外对编程感兴趣的友友们可以加以下群共同学习。群号:127871664