其实web开发很难离开的两种存储数据的方式:cookie和session。
看一下官方api的解析:
其实cookie是访问网站的时候很常用的是一个存储对象,在聊请求头的时候,就可以看到cookie这个参数。
其实很多时候网站记录账号密码自动登录都是通过cookie来进行实现的,当然我们也发现记录账户密码也是又时间限制,也说明cookie不但可以添加修改,还可以修改存储时间。
看图:
为了验证上面的图的过程可以演示一下
写一个servlet其内容如下:
Cookie cookie=new Cookie("name", Base64.getEncoder().encodeToString("张三".getBytes()));
resp.addCookie(cookie);
// 当然也可以这样添加cookie
resp.addHeader("set-cookie","age=12;");
当然还可以在浏览器缓存的界面查看,不同的浏览器位置不同,我以我演示:
这个有涉及到一个问题,那就是其存储的时间多少
现在看一下cookie的方法:
不会聊所有的方法,聊一些重要或者说常用的方法吧。
方法 | 描述 |
---|---|
String getName() | 返回Cookie的名称 |
String getValue() | 用于返回Cookie的值 |
void setMaxAge(int expiry) | 设置 cookie 的最大生存时间,以秒为单位。 正值表示 cookie 将在经过该值表示的秒数后过期。 |
void setPath(String uri) | 指定客户端应该返回 cookie 的路径。 cookie 对于指定目录中的所有页面及该目录子目录中的所有页面都是可见的。 |
void setDomain(String pattern) | 指定应在其中显示此 cookie 的域。 RFC 2109 指定了域名的形式。域名以点 (.foo.com) 开头,意味着在指定域名系统(Domain Name System,DNS)区域中(例如,www.foo.com,但不是 a.b.foo.com)cookie 对于服务器是可见的。默认情况下,cookie 只返回给发送它们的服务器。 |
前三个演示:
// 这里省略了应该判断一些是否又Cookies 不然会报错
for (Cookie cookie:req.getCookies()){
// 这里可以对cookie进行判断,进行修改或者取出
System.out.println(cookie.getName()+" "+cookie.getValue());
}
// 一般缓存中文,都会进行编码处理,一般用base64
Cookie cookie=new Cookie("name", Base64.getEncoder().encodeToString("张三".getBytes()));
// 默认是-1 而-1的意思是浏览器一关,cookie就失效
System.out.println(cookie.getMaxAge());
// 保存一个小时,无力是否关闭浏览器
cookie.setMaxAge(60*60);
resp.addCookie(cookie);
对于 setPath方法需要演示,因为这个方法,还是又神奇的操作的如下尝试
// 一般设置这个参数需要需要访问的url一致,比如我在test2路径下设置cookie.setPath(req.getContextPath()+"/test1");就会报错
cookie.setPath(req.getContextPath()+"/test2");
不设置这个,只要是在cookie中设置的数据,几乎都可以在访问的http://localhost:8080/javaweb项目下任何地址都可以查看到cookie
但是设置之后除非路径是:http://localhost:8080/javaweb/test2其它地方得不到cookie
看图片:
其实最常用的是记录登录账户密码所以就简单的演示一下
首先写一个jsp或者html
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Titletitle>
head>
<body>
<form action="${pageContext.request.contextPath}/test" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="name" value="${cookie.get("name").value}" /> <br>
密码: <input type="password" name="pwd" value="${cookie.get("pwd").value}" /> <br>
<input type="submit" value="登录" >
form>
body>
html>
@WebServlet("/test")
public class test2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name=req.getParameter("name");
String pwd=req.getParameter("pwd");
Cookie cookiename=new Cookie("name",name);
cookiename.setMaxAge(60*60*7);
resp.addCookie(cookiename);
Cookie cookiepwd=new Cookie("pwd",pwd);
cookiepwd.setMaxAge(60*60*7);
resp.addCookie(cookiepwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
session是用户来维护客户端和服务器之间关联的一种技术。看一下官网解释:
每个客户端都有自己的一个session会话,经常用来保存用户登录之后的信息。
现在看一下图演示过程(盗图一张):
现在看一下其方法:
还是老规矩聊一下重要或者说是常用的方法:
在Javaweb’中创建一个session是让给请求得到的:
req.getSession():
如果没有session,第一次调用时创建session对象,之后就是得到这个session
方法 | 描述 |
---|---|
boolean isNew() | 判断是否时第一次创建的sesion然后如果是就返回true否则返回false |
String getId() | 返回包含分配给此会话的唯一标识符的字符串。标识符是由 servlet 容器分配的,并且是与实现相关的,其在cookie是SESSIONID的value值。 |
setAttribute(String name, Object value) | 使用指定名称将对象绑定到此会话。如果具有同样名称的对象已经绑定到该会话,则替换该对象。 |
getAttribute(String name) | 返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回 null 。 |
void removeAttribute(String name) | 从此会话中移除与指定名称绑定在一起的对象。如果会话没有与指定名称绑定在一起的对象,则此方法不执行任何操作 |
setMaxInactiveInterval(int interval) | 指定在 servlet 容器使此会话失效之前客户端请求之间的时间间隔,以秒为单位。负数时间指示会话永远不会超时。其默认是30分钟,因为用的是tomcat,在tomcat的配置文件中。 |
void invalidate() | 使此会话无效,然后取消对任何绑定到它的对象的绑定 |
现在进行简单演示:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Title
请登录然后访问
欢迎${sessionScope.get("name")}
@WebServlet("/test2")
public class test2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=UTF-8");
HttpSession session= req.getSession();
System.out.println(session.isNew());
System.out.println(session.getId());
System.out.println(req.getContextPath());
session.setAttribute("name","张三");
resp.sendRedirect(req.getContextPath()+"/test.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}