D13 Sping Boot 入门 Sping框架--Java Web之Cookie和Session
1、Cookie(保存在客户端)
Ⅰ、什么是Cookie
Ⅱ、如何创建Cookie
1、在com.gychen.web里新建CookieServlet.java并继承BaseServlet.java
1 package com.gychen.web; 2 3 import javax.servlet.ServletException; 4 import javax.servlet.http.HttpServlet; 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 import java.io.IOException; 8 import java.lang.reflect.Method; 9 10 public abstract class BaseServlet extends HttpServlet { 11 12 @Override 13 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 14 15 //解决post中请求中文乱码问题 16 //一定要在获取请求参数之前调用 17 req.setCharacterEncoding("UTF-8"); 18 //解决响应中请求中文乱码问题 19 resp.setContentType("text/html;charset=UTF-8"); 20 21 //判断页面的功能 22 String action = req.getParameter("action"); 23 24 //不用添加一个功能就写一个if,反射获取方法名 25 try { 26 //通过action业务鉴别字符串,获取相应的业务 方法反射对象 27 Method method = this.getClass().getDeclaredMethod 28 (action,HttpServletRequest.class,HttpServletResponse.class); 29 30 //调用目标业务方法 31 method.invoke(this,req,resp); 32 } catch (Exception e) { 33 e.printStackTrace(); 34 } 35 36 } 37 38 @Override 39 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 40 41 doPost(req,resp); 42 43 } 44 }
1 package com.gychen.web; 2 3 import javax.servlet.ServletException; 4 import javax.servlet.http.Cookie; 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 import java.io.IOException; 8 9 public class CookieServlet extends BaseServlet { 10 protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 11 12 //1、创建cookie对象 13 Cookie cookie1 = new Cookie("key1","value1"); 14 //2、通知客户端保存cookie 15 resp.addCookie(cookie1); 16 17 //1、创建cookie对象 18 Cookie cookie2 = new Cookie("key2","value2"); 19 //2、通知客户端保存cookie 20 resp.addCookie(cookie2); 21 22 resp.getWriter().write("Cookie创建成功啦"); 23 } 24 25 26 }
2、在web里新建cookie.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2 <html> 3 <head> 4 <meta http-equiv="pragma" content="no-cache" /> 5 <meta http-equiv="cache-control" content="no-cache" /> 6 <meta http-equiv="Expires" content="0" /> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>Cookie</title> 9 <base href="http://localhost:8080/Cookie_Session/"> 10 <style type="text/css"> 11 12 ul li { 13 list-style: none; 14 } 15 16 </style> 17 </head> 18 <body> 19 <iframe name="target" width="500" height="500" style="float: left;"></iframe> 20 <div style="float: left;"> 21 <ul> 22 <li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li> 23 <li><a href="" target="target">Cookie的获取</a></li> 24 <li><a href="" target="target">Cookie值的修改</a></li> 25 <li>Cookie的存活周期</li> 26 <li> 27 <ul> 28 <li><a href="" target="target">Cookie的默认存活时间(会话)</a></li> 29 <li><a href="" target="target">Cookie立即删除</a></li> 30 <li><a href="" target="target">Cookie存活3600秒(1小时)</a></li> 31 </ul> 32 </li> 33 <li><a href="" target="target">Cookie的路径设置</a></li> 34 <li><a href="" target="target">Cookie的用户免登录练习</a></li> 35 </ul> 36 </div> 37 </body> 38 </html>
Ⅲ、服务器如何获取Cookie
request.getCookies(); //返回Cookie数组
查找指定名称的Cookie
在com.gychen.utils里新建CookieUtils.java
1 package com.gychen.utils; 2 3 import javax.servlet.http.Cookie; 4 5 public class CookieUtils { 6 7 /** 8 * 查找指定名称的Cookie对象 9 * @param name 想要查找的cookie的key 10 * @param cookies cookies 11 * @return 12 */ 13 public static Cookie findCookie(String name, Cookie[] cookies){ 14 15 if (name == null || cookies == null || cookies.length == 0){ 16 return null; 17 } 18 19 for (Cookie cookie : cookies) { 20 if (name.equals(cookie.getName())){ 21 return cookie; 22 } 23 } 24 25 return null; 26 } 27 }
在CookieServlet.java中调用CookieUtils中的方法来查询cookie
1 package com.gychen.web; 2 3 import com.gychen.utils.CookieUtils; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.Cookie; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 import java.io.IOException; 10 11 public class CookieServlet extends BaseServlet { 12 13 /** 14 * 创建cookie 15 */ 16 protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 17 18 //1、创建cookie对象 19 Cookie cookie1 = new Cookie("key1","value1"); 20 //2、通知客户端保存cookie 21 resp.addCookie(cookie1); 22 23 //1、创建cookie对象 24 Cookie cookie2 = new Cookie("key2","value2"); 25 //2、通知客户端保存cookie 26 resp.addCookie(cookie2); 27 28 resp.getWriter().write("Cookie创建成功啦"); 29 } 30 31 32 /** 33 * 服务器获取cookie 34 */ 35 protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 36 37 Cookie[] cookies = req.getCookies(); 38 39 for (Cookie cookie : cookies) { 40 // System.out.println(cookie); 41 // //输出给客户端 42 resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br />"); 43 44 } 45 46 47 //查找想要的cookie 48 //法一: 49 Cookie iwantCookie = null; 50 for (Cookie cookie : cookies) { 51 //输出给客户端 52 resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br />"); 53 if ("key2".equals(cookie.getName())) { 54 iwantCookie = cookie; 55 break; 56 } 57 } 58 59 //如果不等于null,说明赋过值,也就是找到了需要的Cookie 60 if (iwantCookie != null) { 61 resp.getWriter().write("找到了需要的key2="+iwantCookie.getValue()); 62 } 63 64 //法二: 65 Cookie iwantCookie2 = CookieUtils.findCookie("key1",cookies); 66 resp.getWriter().write("<br/>找到key1="+iwantCookie2.getValue()); 67 } 68 }
Ⅳ、修改Cookie值
1 /** 2 * 修改cookie值 3 */ 4 protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 //方案一 6 // ①、先创建一个要修改的同名的Cookie对象。 7 // ②、在构造器,同时赋予新的Cookie值。 8 Cookie cookie = new Cookie("key1","newValue1"); 9 // ③、调用response.assCookie(Cookie)。 10 resp.addCookie(cookie); 11 resp.getWriter().write("key1已修改"); 12 13 }
①、先创建一个要修改的同名的Cookie对象。
②、在构造器,同时赋予新的Cookie值。
③、调用response.addCookie(Cookie)通知客户端保存修改。
1 /** 2 * 修改cookie值 3 */ 4 protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 6 //方案二: 7 // ①、先查找到需要修改的Cookie对象。 8 Cookie cookie = CookieUtils.findCookie("key2",req.getCookies()); 9 if (cookie != null){ 10 // ②、调用setValue()方法赋予新的Cookie值。 11 cookie.setValue("newValue2"); 12 // ③、调用response.assCookie(Cookie)通知客户端保存修改。 13 resp.addCookie(cookie); 14 resp.getWriter().write("key2已修改"); 15 } 16 17 18 }
①、先查找到需要修改的Cookie对象。
②、调用setValue()方法赋予新的Cookie值。
③、调用response.addCookie(Cookie)通知客户端保存修改。
Ⅴ、Cookie生命周期控制
Cookie的生命周期控制指的是如何管理Cookie什么时候被销毁(删除)
public void setMaxAge(int expiry) //设置cookie的最大生存时间,以秒为单位。
参数为
正数:表示指定的秒数后过期。
负数:表示浏览器一关,Cookie就会被删除(默认值-1)。
零:表示马上删除Cookie。
1 /** 2 * Cookie生命控制:浏览器关闭后删除 3 * 负数:表示浏览器一关,Cookie就会被删除(默认值-1)。 4 */ 5 protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 6 7 // setMaxAge(int expiry)参数为 8 // 正数:表示指定的秒数后过期。 9 // 负数:表示浏览器一关,Cookie就会被删除(默认值-1)。 10 // 零:表示马上删除Cookie。 11 Cookie cookie = new Cookie("defaultLife","defaultLife"); 12 //设置最大生存时间 13 cookie.setMaxAge(-1); 14 resp.addCookie(cookie); 15 resp.getWriter().write(cookie.getValue()); 16 17 } 18 19 20 /** 21 * Cookie生命控制:立即删除 22 * 零:表示马上删除Cookie。 23 */ 24 protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 25 26 // setMaxAge(int expiry)参数为 27 // 正数:表示指定的秒数后过期。 28 // 负数:表示浏览器一关,Cookie就会被删除(默认值-1)。 29 // 零:表示马上删除Cookie。 30 Cookie cookie = CookieUtils.findCookie("key1",req.getCookies()); 31 if (cookie != null) { 32 //设置最大生存时间 33 cookie.setMaxAge(0); 34 resp.addCookie(cookie); 35 resp.getWriter().write(cookie.getValue()+"已删除"); 36 } 37 38 39 } 40 41 42 /** 43 * Cookie生命控制:1小时后删除 44 * 正数:表示指定的秒数后过期。 45 */ 46 protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 47 48 // setMaxAge(int expiry)参数为 49 // 正数:表示指定的秒数后过期。 50 // 负数:表示浏览器一关,Cookie就会被删除(默认值-1)。 51 // 零:表示马上删除Cookie。 52 Cookie cookie = new Cookie("life3600","life3600"); 53 //设置最大生存时间 54 cookie.setMaxAge(3600); 55 resp.addCookie(cookie); 56 resp.getWriter().write(cookie.getValue()); 57 58 }
Ⅵ、Cookie有效路径Path的设置
Cookie的Path属性可以有效的过滤哪些cookie可以发送给服务器,哪些不发。
path属性是通过请求的地址来进行有效的过滤。
1 /** 2 * Cookie的Path属性 3 */ 4 protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 6 Cookie cookie = new Cookie("path","path"); 7 cookie.setPath(req.getContextPath()+"/abc"); //工程名/abc 8 resp.addCookie(cookie); 9 resp.getWriter().write(req.getContextPath()+"/abc"); 10 }
Ⅶ、Cookie练习--免用户名登录
①、新建login.jsp
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>免用户名登录</title> 5 </head> 6 <body> 7 8 <form action="loginServlet" method="get"> 9 用户名:<input type="text" name="username" id="username" value="${cookie.username.value}"><br> 10 密码:<input type="password" name="password" id="password"><br> 11 <input type="submit" value="登录"> 12 </form> 13 14 </body> 15 </html>
②、新建LoginServlet.java
1 package com.gychen.web; 2 3 import javax.servlet.ServletException; 4 import javax.servlet.http.Cookie; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 import java.io.IOException; 9 10 public class LoginServlet extends HttpServlet { 11 12 @Override 13 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 14 15 String username = req.getParameter("username"); 16 String password = req.getParameter("password"); 17 18 //判断用户名和密码正确性 19 if ("gychen".equals(username) && "123456".equals(password)){ 20 21 //登录成功 22 Cookie cookie = new Cookie("username",username); 23 //设置当前Cookie一周内有效 24 cookie.setMaxAge(60*60*24*7); 25 resp.addCookie(cookie); 26 System.out.println("login success"); 27 }else { 28 //登录失败 29 System.out.println("login failed"); 30 } 31 } 32 }
2、Session(保存在服务器端)
Ⅰ、什么是Session会话
①、Session就是一个接口(HttpSession)。
②、Session就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。
③、每个客户端都有一个自己的Session会话。
④、Session会话中,我们经常用来保护用户登录之后的信息。
Ⅱ、如何创建和获取Session(API一样)
request.getSession();//第一次调用是创建Session对话。之后调用都是获取前面创建号的Session会话对象。
1 isNew();//判断是否是新创建的 2 // true:表示刚创建 3 //false:表示之前创建
每个Session都有一个唯一的身份id,通过 getId(); 获取。
Ⅲ、Session域数据的存取
1 /** 2 * 往session域中保存数据 3 * @param req 请求 4 * @param resp 响应 5 */ 6 protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws IOException { 7 8 req.getSession().setAttribute("key1","value1"); 9 resp.getWriter().write("key1已创建"); 10 } 11 12 13 /** 14 * 获取Session域中的数据 15 * @param req 请求 16 * @param resp 响应 17 */ 18 protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws IOException { 19 20 Object attribute = req.getSession().getAttribute("key1"); 21 resp.getWriter().write("从session域中获取出key1的值是:"+attribute); 22 23 }
Ⅳ、Session生命周期控制
public void setMaxInactiveInterval(int interval);//设置的超时时间(以秒为单位),超过指定时长,Session就会被销毁。
值为正数的时候,设定 Session 的超时时长。
负数表示永不超时(极少使用)
Session超时指的是客户端两次请求的最大间隔时长。
public void session.getMaxInactiveInterval();//获取session的超时时长
1 <!--表示当前 web 工程。创建出来 的所有 Session 默认是 20 分钟 超时时长--> 2 <session-config> 3 <session-timeout>20</session-timeout> 4 </session-config>
1 /** 2 * Session生命周期控制 3 * Session的默认超时时长 tomcat默认1800s、30min、可以在web.xml里改 4 * @param req 请求 5 * @param resp 响应 6 */ 7 protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws IOException { 8 9 //获取Session默认的超时时长 10 11 int maxInactiveInterval = req.getSession().getMaxInactiveInterval(); 12 resp.getWriter().write("Session的默认超时时长是:"+maxInactiveInterval+"s"); 13 14 } 15 16 17 /** 18 * Session生命周期控制 19 * Session 3s 超时销毁 20 * @param req 请求 21 * @param resp 响应 22 */ 23 protected void life3(HttpServletRequest req, HttpServletResponse resp) throws IOException { 24 25 //先获取Session会话对象 26 HttpSession session = req.getSession(); 27 28 //设置当前Session 3s 后超时 29 session.setMaxInactiveInterval(3); 30 resp.getWriter().write("当前Session 3s 后超时销毁"); 31 32 } 33 34 35 /** 36 * Session生命周期控制 37 * Session 立即销毁 38 * @param req 请求 39 * @param resp 响应 40 */ 41 protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws IOException { 42 43 //先获取Session会话对象 44 HttpSession session = req.getSession(); 45 46 //设置当前Session 立即超时 47 session.invalidate(); 48 resp.getWriter().write("当前Session 立即销毁"); 49 50 }
Ⅴ、浏览器和 Session 之间关联的技术内幕