众所周知,开学上网课,等于没开学,所以现在,还是寒假😁,所以👴的寒假还没有结束捏🤗
🤗文章目录🤗
🤗Cookie
1、什么是Cookie
1、Cookie 翻译过来是饼干的意思。
2、Cookie 是服务器通知客户端保存键值对的一种技术。
3、客户端有了Cookie后,每次请求都发送给服务器。
4、每个Cookie的大小不能超过4kb
2、如何创建Cookie
为了方便展示,我们使用,视频课程提供好的cookie.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Cookie</title>
<base href="http://localhost:8080/cookie_session/">
<style type="text/css">
ul li {
list-style: none;
}
</style>
</head>
<body>
<iframe name="target" width="500" height="500" style="float: left;"></iframe>
<div style="float: left;">
<ul>
<li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li>
<li><a href="cookieServlet?action=getCookie" target="target">Cookie的获取</a></li>
<li><a href="cookieServlet?action=updateCookie" target="target">Cookie值的修改</a></li>
<li>Cookie的存活周期</li>
<li>
<ul>
<li><a href="cookieServlet?action=defaultLife" target="target">Cookie的默认存活时间(会话)</a></li>
<li><a href="cookieServlet?action=deleteNow" target="target">Cookie立即删除</a></li>
<li><a href="cookieServlet?action=life3600" target="target">Cookie存活3600秒(1小时)</a></li>
</ul>
</li>
<li><a href="cookieServlet?action=testPath" target="target">Cookie的路径设置</a></li>
<li><a href="" target="target">Cookie的用户免登录练习</a></li>
</ul>
</div>
</body>
</html>
图解
通过Set-Cookie通知客户端保存Cookie
代码实现
这里我们继承的是书城项目的BaseServlet,因为可以偷个懒😁
public class CookieServlet extends BaseServlet{
protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、创建Cookie对象
Cookie cookie = new Cookie("k1","v1");
// 2、通知客户端保存Cookie
resp.addCookie(cookie);
resp.getWriter().write("创建Cookie成功");
}
}
BaseServlet
public abstract class BaseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 解决post请求中文乱码问题
// 一定要在获取请求参数之前调用才有效
request.setCharacterEncoding("UTF-8");
// 解决响应中文乱码问题
response.setContentType("text/html; charset=UTF-8");
String action = request.getParameter("action");
try {
// 获取action业务鉴别字符串,获取相应的业务 方法反射对象
Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
// 调用目标业务 方法
method.invoke(this,request,response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
配置XML
<servlet>
<servlet-name>CookieServlet</servlet-name>
<servlet-class>com.flzj.servlet.CookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieServlet</servlet-name>
<url-pattern>/cookieServlet</url-pattern>
</servlet-mapping>
效果展示
3、服务器如何获取Cookie
服务器获取客户端的Cookie只需要一行代码: request.getCookies();
会返回Cookie[]
图解
代码实现
在Cookie.html
的a标签,添加跳转到这个程序
<li><a href="cookieServlet?action=getCookie" target="target">Cookie的获取</a></li>
给CookieServlet
完善功能
// 服务端获取cookie
protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
// getName方法返回cookie的key (名)
// getValue. 方法返回cookie的value值
resp.getWriter().write("Cookie[" + cookie.getName() + " = " + cookie.getValue() + "]" + "<br/>" );
}
}
如何获取指定的key捏
for循环遍历,获取,这里我们封装到util/CookieUtils.java
下
public class CookieUtils {
public static Cookie findCookie(String name,Cookie[] cookies){
if(name == null || cookies.length == 0 || cookies == null){
return null;
}
for (Cookie cookie : cookies) {
if(cookie.getName().equals(name)){
return cookie;
}
}
return null;
}
}
测试效果
resp.getWriter().write(CookieUtils.findCookie("key1",cookies) == null ? "查找成功" : "查找失败" );
4、Cookie值的修改
方案一
1、先创建一一个要修改的同名的Cookie对象
2、在构造器,同时赋于新的Cookie值
3、调用response.addCookie(Cookie);
// 修改Cookie
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("调用updateCookie方法");
// 方案一
// 1、先创建一个要修改的同名的Cookie对象
// 2、在构造器,同时赋于新的Cookie值。
Cookie cookie = new Cookie("k1","newV1");
// 3、调用response.addCookie( Cookie );
resp.addCookie(cookie);
resp.getWriter().write("k1已修改好");
}
这里小小解释下第二步,客户端会看一下,有没有这个Cookie值,没有就创建,有就修改
方案二
1、先查找到需要修改的Cookie对象
2、调用setValue()方法赋于新的Cookie值
3、调用response.addCookie()通知客户端保存修改
// 修改Cookie
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("调用updateCookie方法");
// 方案二
// 1、先查找到需要修改的Cookie对象
Cookie cookie = CookieUtils.findCookie("k2",req.getCookies());
// 2、调用setValue()方法赋于新的Cookie值。
if(cookie != null) {
cookie.setValue("newV2");
// 3、调用response.addCookie()通知客户端保存修改
resp.addCookie(cookie);
}
resp.getWriter().write("k2已修改好");
}
5、Cookie的存活设置
Cookie的生命控制指的是如何管理Cookie什么时候被销毁(删除)
setMaxAge()
正数,表示在指定的秒数后过期
负数,表示浏览器一关, Cookie就会被删除(默认值是-1)
零,表示马上删除Cookie
设置默认时间
cookie.html
里,a标签路径改改
<li><a href="cookieServlet?action=defaultLife" target="target">Cookie的默认存活时间(会话)</a></li>
在CookiServlet
多写个defaultLife()方法
// 设置默认时间
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("defaultLife","defaultLife");
cookie.setMaxAge(-1); // 设置存活时间
resp.addCookie(cookie);
}
立刻删除Cookie
// 设置妙删时间
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("defaultNow","defaultNow");
cookie.setMaxAge(0); // 设置存活时间
resp.addCookie(cookie);
resp.getWriter().write("立即删除Cookie成功");
}
设置一小时后删除
// 设置一小时删除
protected void deleteHour(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("k3600","v3600");
cookie.setMaxAge(60*60);
resp.getWriter().write("设置生命周期为一小时");
}
6、Cookie的path属性
Cookie的path属性可以有效的过滤哪些Cookie可以发送给服务器。哪些不发。
path属性是通过请求的地址来进行有效的过滤。
举例
CookieA path=/工程路径
CookieB path=/工程路径/abd
请求地址如下:
http://ip:port/工程路径/a.html
CookieA发送
CookieB不发送
http://ip:port/工程路径/abc/a.html
CookieA发送
CookieB发送
setPath()方法
设置Cookie的path
protected void textPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie1 = new Cookie("path1", "path1");
Cookie cookie2 = new Cookie("path2", "path2");
// /工程路径/
cookie1.setPath(req.getContextPath());
// /工程路径/abc
cookie2.setPath(req.getContextPath() + "/abc");
resp.addCookie(cookie1);
resp.addCookie(cookie2);
}
path2因为不满足路径,所以没有出现
7、练习-免用户名登入
图解
代码实现
登入页面login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登入界面</title>
</head>
<body>
<form action="" method="get">
用户名: <input type="text" name="username" value="${cookie.username.value}" placeholder="请输入用户名"><br/>
密码: <input type="password" name="password" placeholder="请输入密码" ><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
LoginServlet
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
if("flzj_kl".equals(username) && "123456".equals(password)){
System.out.println("登入成功");
Cookie cookie = new Cookie("username", username);
cookie.setMaxAge(60 * 60); // 一小时后Cookie失效
response.addCookie(cookie);
//设置服务器的字符集为UTF-8
response.setCharacterEncoding("UTF-8"); //只加上会乱码
//通过响应头,设置浏览器使用UTF-8
response.setHeader("Content-Type","text/html; charset=UTF-8");
response.getWriter().write("登入成功");
}else{
System.out.println("登入失败");
}
}
🤗Session
1、什么是Session
1、Session 就一个接口( HttpSession)
2、session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。
3、每个客户端都有自己的一个Session 会话。
4、Session 会话中,我们经常用来保存用户登录之后的信息。
2、Session创建和获取
request.getSession()
创建和获取的API是一样的
第一次调用是:创建Session会话
之后调用都是,获取前面创建好的Session会话对象。
isNew()
判断到底是不是刚创建出来的(新的)
true表示刚刚创建,false表示获取之前创建
getId()
每个会话都有一个身份证号。也就是ID值。而且这个1D是唯一的。getld()得到Session的会话id值。
测试效果
为了方便展示,我们用了课程自带的session.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Session</title>
<base href="http://localhost:8080/13_cookie_session/">
<style type="text/css">
ul li {
list-style: none;
}
</style>
</head>
<body>
<iframe name="target" width="500" height="500" style="float: left;"></iframe>
<div style="float: left;">
<ul>
<li><a href="" target="target">Session的创建和获取(id号、是否为新创建)</a></li>
<li><a href="" target="target">Session域数据的存储</a></li>
<li><a href="" target="target">Session域数据的获取</a></li>
<li>Session的存活</li>
<li>
<ul>
<li><a href="" target="target">Session的默认超时及配置</a></li>
<li><a href="" target="target">Session3秒超时销毁</a></li>
<li><a href="" target="target">Session马上销毁</a></li>
</ul>
</li>
<li><a href="" target="target">浏览器和Session绑定的原理</a></li>
</ul>
</div>
</body>
</html>
修改a标签的链接
<li><a href="sessionServlet?action=createOrGetSession" target="target">Session的创建和获取(id号、是否为新创建)</a></li>
编写SessionServlet类的createOrGetSession()方法
protected void createOrGetSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建和获取Session对象
HttpSession session = req.getSession();
// 判断Session对象是否是新创建出来的
boolean isNew = session.isNew();
// 获取Session会话唯一标识id
String id = session.getId();
// 输出出到页面上看看把
resp.getWriter().write("得到的Session,它的id是" + id + "<br/>");
resp.getWriter().write("判断这个Session是否是新创建的" + isNew + "<br/>");
}
3、Session域的存取
getAttribute()方法和setAttribute()方法
代码测试
改改a标签
<li><a href="sessionServlet?action=setAttribute" target="target">Session域数据的存储</a></li>
<li><a href="sessionServlet?action=getAttribute" target="target">Session域数据的获取</a></li>
完成setAttribute和getAttribute方法
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().setAttribute("k1","v1");
resp.getWriter().write("已成功向Session域中保存数据");
}
protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object attribute = req.getSession().getAttribute("k1");
resp.getWriter().write("从Session域中取出k1的值是:" + attribute );
}
4、Session超时的控制
关于生命控制的API
API | 作用 |
---|---|
public void setMaxInactiveInterval(int interval) | 设置Session的超时时间(以秒为单位), 超过指定的时长,Session就会被销毁,interval为负数表示永不超时(极少使用) |
public int getMaxInactiveInterval() | 获取Session的超时时长 |
public void invalidate() | 让当前Session会话马上超时无效 |
Session 默认的时长
30 分钟,以下是证明
我们写代码自己也可以看看
<li><a href="sessionServlet?action=defaultLife" target="target">Session的默认超时及配置</a></li>
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int maxInactiveInterval = req.getSession().getMaxInactiveInterval();
resp.getWriter().write("Session默认的时长是" + maxInactiveInterval);
}
因为在Tomcat服务器的配置文件web.xml中(CATALINA_BASE/config/web.xml
)默认有以下的配置,它就表示配置了当前Tomcat服务器下所有的Session超时配置默认时长为: 30分钟
如果你希望你的web工程,默认的Session的超时时长为,其他时长。你可以在你自己的web.xml配置文件中做
以上相同的配置。就可以修改你的web工程所有Seession的默认超时时长。下图,自己修改成20分钟
修改个别Session的超时时长
通过setMaxInactiveInterval()方法
<li><a href="sessionServlet?action=life3" target="target">Session3秒超时销毁</a></li>
protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().setMaxInactiveInterval(3);
resp.getWriter().write("当前Session设置为3秒后超时");
}
视频里,老师疯狂点击,a标签,导致3秒还删不掉,这是怎么回是捏?解释,如下图
Session 的马上销毁
<li><a href="sessionServlet?action=deleteNow" target="target">Session马上销毁</a></li>
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取Session对象
HttpSession session = req.getSession();
// 让Session会话马上超时
session.invalidate();
resp.getWriter().write("Session已设置为超时(无效)");
}
5、浏览器和Session之间关联的技术内幕
Session技术,底层其实是基于Cookie技术来实现的。