D13 Sping Boot 入门 Sping框架--Java Web之Cookie和Session
Posted 菜鸟的博客笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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<以上是关于D13 Sping Boot 入门 Sping框架--Java Web之Cookie和Session的主要内容,如果未能解决你的问题,请参考以下文章
D08 Sping Boot 入门 Sping框架--Java Web之JSP
D16 Sping Boot 入门 Sping框架--Java Web之书城项目 dingda模块
D16 Sping Boot 入门 Sping框架--Java Web之书城项目 dingda模块
D17 Sping Boot 入门 Sping框架--Java Web之Filter过滤器