JSP ---[Cookie]
Posted 小智RE0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP ---[Cookie]相关的知识,希望对你有一定的参考价值。
cookie
cookie (储存在用户本地终端上的数据)
Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息; Cookie 并不是它的原意“甜饼”的意思, 而是一个保存在客户机中的简单的文本文件, 这个文件与特定的 Web 文档关联在一起, 保存了该客户机访问这个Web 文档时的信息, 当客户机再次访问这个 Web 文档时这些信息可供该文档使用。由于“Cookie”具有可以保存在客户机上的神奇特性, 因此它可以帮助我们实现记录用户个人信息的功能, 而这一切都不必使用复杂的CGI等程序;举例来说, 一个 Web 站点可能会为每一个访问者产生一个唯一的ID, 然后以 Cookie 文件的形式保存在每个用户的机器上。如果使用浏览器访问 Web, 会看到所有保存在硬盘上的 Cookie。在这个文件夹里每一个文件都是一个由“名/值”对组成的文本文件,另外还有一个文件保存有所有对应的 Web 站点的信息。在这里的每个 Cookie 文件都是一个简单而又普通的文本文件。透过文件名, 就可以看到是哪个 Web 站点在机器上放置了Cookie(当然站点信息在文件里也有保存)
Cookie是一段不超过4KB的小型文本数据,由一个名称(Name)、一个值(Value)和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。
组成 | 说明 |
---|---|
Name/Value | 设置Cookie的名称及相对应的值 |
Expires属性 | 设置Cookie的生存期。 |
Path属性 | 定义Web站点上可以访问当前Cookie的目录 |
Domain属性 | 指定可访问当前 Cookie 的 Web 站点或域 |
Secure属性 | 指定是否使用HTTPS安全协议发送Cookie |
HTTPOnly 属性 | 用于防止客户端脚本通过document.cookie属性访问Cookie |
通过cookie对象,可以从服务器端向客户端响应一些信息
,这些信息存储在浏览器的内存中
,浏览器关闭,数据就不存在.
Cookie是保存在客户端的小文本,保存的位置分两种
- 保存在客户端浏览器的所占内存中,关闭浏览器后,Cookie就不再存在。
- 保存在客户PC机的硬盘上,可设置有效时间,超出时间后失效。
Tomcat9后可以直接存中文数据
创建cookie对象
以键值对形式的字符串存储.
Cookie newCookie=new Cookie(“name", “value");
cookie类中的方法
方法 | 注释 |
---|---|
void setMaxAge(int expiry) | 设置Cookie的有效期 (以秒为单位),Cookie保存在硬盘上,或者保存在内存中 |
void setValue(String value) | 在Cookie创建后,对Cookie进行赋值 |
String getName( ) | 获取Cookie的名称(键) |
String getValue( ) | 获取Cookie的值 |
String getMaxAge( ) | 获取Cookie的有效时间,以秒为单位 |
将cookie保存客户端
需要使用响应HttpServletResponse中的addCookie( cookie对象 )方法
通过一个案例看看 cookie 的基础应用
(1)在登录时,浏览器保存用户名和和密码;默认存在浏览器中;关闭浏览器后,存储的数据信息就会消失.
- servlet文件,
LoginServlet
类
//使用注解方式配置servlet
@WebServlet(name = "login",urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式;
req.setCharacterEncoding("utf-8");
//获取页面中对应name的值;
String account = req.getParameter("account");
String password = req.getParameter("password");
//是否记住密码的标记;
String rememberPW = req.getParameter("RememberPW");
//创建session对象;
HttpSession session;
//这里仅仅是用equals方法进行了判断;
if (account.equals("xiaozhi") && password.equals("123456")) {
//当拿到的标记不为空时;创建cookie对象封装数据;
if(rememberPW!=null){
Cookie name=new Cookie("name",account);
Cookie pw=new Cookie("password",password);
//在响应时将cookie对象传到客户端;
resp.addCookie(name);
resp.addCookie(pw);
}
//从请求对象中获取对应的session对象;
session = req.getSession();
//将上面获取到的account的值设置给名为 name的属性;(以键值对的形式);
session.setAttribute("name",account);
//若符合条件,则重定向到页面LoginSuccess.jsp;
resp.sendRedirect("loginSuccess.jsp");
} else {
//从请求对象中获取对应的session对象;
session=req.getSession();
//设置属性名为 errorMsg 的值为 "账号或密码错误!"
session.setAttribute("errorMsg", "账号或密码错误!");
//将页面重定向到login.jsp;
resp.sendRedirect("login.jsp");
}
}
}
- 登录页面,
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<div>
<%--获取到session对象中属性名为 errorMsg 的值 ;若不存在,则返回 null 值--%>
<%--此时获取到的session对象和客户端访问服务器的是同一个;(都在同一个浏览器)--%>
<%
String errorMsg =(String) session.getAttribute("errorMsg");
out.print(errorMsg+"<br/>");
%>
</div>
<form action="login" method="post">
账号:<input type="text" name="account"/><br/>
密码:<input type="password" name="password"/><br/>
<input type="submit" value="登录"/><br/>
记住密码:<input type="checkbox" name="RememberPW" value="RememberPW"/>
</form>
</body>
</html>
- 登录成功
loginSuccess.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录成功</title>
</head>
<body>
<%--通过getAttribute方法获取到指定的参数名(name)对应的值;若不存在,则返回 null 值--%>
<%--此时获取到的session对象和客户端访问服务器的是同一个;(都在同一个浏览器)--%>
<%
String account = (String) session.getAttribute("name");
%>
<%
out.print("用户==> "+account+"你来了!"+"<br/>");
%>
</body>
</html>
启动服务器
进入成功页面,可看到页面在重定向时,就已经拿到了服务器响应过来的cookie对象;
查看页面cookie信息;浏览器会话结束时,cookie就会消失
(2)设置 cookie 保存在客户PC机的硬盘上,可设置有效时间,超出时间后失效。
在LoginServlet
类中响应发送cookie时,先设置有效时间.
......
//当拿到的标记不为空时;创建cookie对象封装数据;
if(rememberPW!=null){
Cookie name=new Cookie("name",account);
Cookie pw=new Cookie("password",password);
//设置Cookie的有效期(以秒为单位)
name.setMaxAge(365*24*3600);
pw.setMaxAge(365*24*3600);
//在响应时将cookie对象传到客户端;
resp.addCookie(name);
resp.addCookie(pw);
}
......
启动浏览器;登录成功,查看页面保存的cookie
关闭浏览器;查看浏览器缓存
再次访问与保存Cookie相同域名的网站时,HTTP协议将把有效时间内的Cookie都发送到服务器,容器将把Cookie封装到请求中
那么浏览器得到响应过来的cookie值时;
需要先使用HttpServletRequest类的getCookies( )方法获取到所有cookie,该方法的返回值类型为cookie[ ]数组;(注意对拿到的cookie进行判空处理)
然后在通过getName( )
,getValue( )
; 方法获取名称和值;
案例;
(1)在服务器端获取cookie
在登录的jsp文件中直接编写Java代码;
login.jsp
;将获取到的值输到账号密码填入框中.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<%--在服务器端获取到cookie--%>
<%
//定义用户名和密码两个变量;
String name = "";
String password = "";
//获取请求中的所有cookie;
Cookie[] cookies = request.getCookies();
//对获取的cookie判空;避免出现空指针异常;
if (cookies != null) {
//遍历获取到的cookie数组;
for(Cookie ck:cookies){
//得到对应name的cookie后;取到对应的值;
if(ck.getName().equals("name")){
name=ck.getValue();
}
if(ck.getName().equals("password")){
password=ck.getValue();
}
}
}
%>
<div>
<%--获取到session对象中属性名为 errorMsg 的值 ;若不存在,则返回 null 值--%>
<%--此时获取到的session对象和客户端访问服务器的是同一个;(都在同一个浏览器)--%>
<%
String errorMsg =(String) session.getAttribute("errorMsg");
out.print(errorMsg+"<br/>");
%>
<%--这里直接在用户名和密码标签的value输入值;--%>
</div>
<form action="login" method="post">
账号:<input type="text" name="account" value="<%out.print(name);%>"/><br/>
密码:<input type="password" name="password" value="<%out.print(password);%>"/><br/>
<input type="submit" value="登录"/><br/>
记住密码:<input type="checkbox" name="RememberPW" value="RememberPW"/>
</form>
</body>
</html>
启动浏览器,刷新页面,就会直接将在请求中获取到的用户名与密码;输在表单的输入框中.
(2)在客户端获取cookie;通过JS语言中获取网页对象的办法;
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<%--在客户端获取到cookie--%>
<%--部署jQuery--%>
<script src="js/jquery.1.8.3.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
//将取到的字符串按分号分隔为数组;
var str = document.cookie.split(";");
for (let i = 0; i < str.length; i++) {
//遍历时拿到单个的值;
var chStr = str[i];
//将键和值按=分隔为数组;
var halfChStr = chStr.split("=");
//注意去除空格再进行判断;
if (halfChStr[0].trim() == "name") {
//通过取到对应的Id进行赋值;
$("#nmId").val(halfChStr[1]);
}
if (halfChStr[0].trim() == "password") {
$("#pwId").val(halfChStr[1]);
}
}
});
</script>
<div>
<%--获取到session对象中属性名为 errorMsg 的值 ;若不存在,则返回 null 值--%>
<%--此时获取到的session对象和客户端访问服务器的是同一个;(都在同一个浏览器)--%>
<%
String errorMsg =(String) session.getAttribute("errorMsg");
out.print(errorMsg+"<br/>");
%>
<%--这里直接在用户名和密码标签的value输入值;--%>
</div>
<form action="login" method="post">
账号:<input type="text" name="account" value=""id="nmId"/><br/>
密码:<input type="password" name="password" value="" id="pwId"/><br/>
<input type="submit" value="登录"/><br/>
记住密码:<input type="checkbox" name="RememberPW" value="RememberPW"/>
</form>
</body>
</html>
启动浏览器,刷新页面,就会直接将在浏览器的缓存中获取用户名与密码;输在表单的输入框中.
cookie与session的区别
- session
在服务器端保存用户信息
,Cookie在客户端保存用户信息
- session中可以保存
任意对象
,Cookie保存的是字符串
(键值对对应); - session生命周期结束后,信息随之消失,Cookie可以
长期保存在客户端硬盘上
,也可以临时保存在浏览器内存中 - session由于存储在服务器;所以安全性高.
存储大小不同
,Cookie是一段不超过4KB的小型文本数据,由一个名称(Name)、一个值(Value)和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。而session存储数据大小高于cookie
.
以上是关于JSP ---[Cookie]的主要内容,如果未能解决你的问题,请参考以下文章