Cookie概念
Cookie在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookie就是一个键和一个值构成的,随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。
Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!
可以在页面右键点击检查或者按F12,点击应用程序,选择Cookie:
Cookie的API
创建Cookie
方法:
new 构造方法
Cookie cookie1 = new Cookie("username",user);
Cookie cookie2 = new Cookie("password",password);
注:如果服务器端发送重复的Cookie那么会覆盖原有的Cookie 。
保存至客户端浏览器
方法:
通过响应对象 addCookie(创建的cookie)
resp.addCookie(cookie1);
resp.addCookie(cookie2);
获取服务器端cookie内容
方法:
请求对象.getCookies()
该方法返回的是一个Cookie数组,需要通过遍历才能获得想要的值。
Cookie[] cookies = request.getCookies();
String username ="";
String password ="";
if(cookies.length > 0 && cookies != null){
for(Cookie cookie:cookies){
if(cookie.getName().equals("username")){
username = cookie.getValue();
}
if(cookie.getName().equals("password")){
password = cookie.getValue();
}
}
}
设置路径
方法:
cookie.setPath("路径")
- 设置的路径必须与当前页面的路径匹配,否则浏览器将不会发送此Cookie。例如,如果Cookie的路径设置为
/login
,那么只有URL中包含/login
路径的页面才能访问这个Cookie。- 子路径可以访问父路径的Cookie,但父路径不能访问子路径的Cookie。例如,如果Cookie的路径设置为
/parent
,那么/parent/child
路径下的页面可以访问这个Cookie,但/child
路径下的页面不能访问。
设置最大存活时间
Cookie的最大存活时间是指Cookie在客户端(如浏览器)上可以被存储和保留的最长时间。这个时间由Cookie的创建者(通常是Web服务器)在设置Cookie时指定,并受到浏览器和Web标准的限制。
默认存活时间: 会话级别, 浏览器关闭, 这个cookie就会被删除
方法:setMaxAge(int 参数) 单位: 秒
cookie1.setMaxAge(60*60*24*7);
cookie2.setMaxAge(60*60*24*7);
Cookie特征
cookie的key,value都是String类型
创建于服务器,保存在客户端浏览器上,不同浏览器之间cookie无法共享,不能跨浏览器
在之后的请求中,cookie以请求头的方式自动发送给服务器
实现功能
通过以上内容,可以实现登录时的“记住我” 功能
import com.fs.entity.LoginInfo;
import com.fs.service.LoginService;
import com.fs.service.impl.LoginServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置post请求编码
req.setCharacterEncoding("UTF-8");
// resp.setContentType("text/html;charset=UTF-8");
//拿到用户输入的验证码
String yzm = req.getParameter("verifycode");
//获得请求参数
String user = req.getParameter("user");
String password = req.getParameter("password");
//调用service方法
LoginService loginService = new LoginServiceImpl();
LoginInfo loginInfo = loginService.login(user,password);
if(loginInfo != null){//登录成功
//先判断是否勾选“记住我”
String rem = req.getParameter("rem");
if(rem != null){
//保存用户名密码
Cookie cookie1 = new Cookie("username",user);
Cookie cookie2 = new Cookie("password",password);
//设置最大存活时间
cookie1.setMaxAge(60*60*24*7);
cookie2.setMaxAge(60*60*24*7);
//设置路径
cookie1.setPath("/");
cookie2.setPath("/");
resp.addCookie(cookie1);
resp.addCookie(cookie2);
}
//重定向到index.html
resp.sendRedirect("/index.jsp");
}else{
//转发到登录页面
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="zh-CN">
<head>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>管理员登录</title>
<!-- 1. 导入CSS的全局样式 -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- 2. jQuery导入,建议使用1.9以上的版本 -->
<script src="js/jquery-2.1.0.min.js"></script>
<!-- 3. 导入bootstrap的js文件 -->
<script src="js/bootstrap.min.js"></script>
<script type="text/javascript">
function refreshCode(){
const a = new Date().getTime();
$("#vcode").attr("src","/checkCode?time="+a);
console.log(a)
}
</script>
</head>
<body>
<%
//先获取cookie
Cookie[] cookies = request.getCookies();
String username ="";
String password ="";
if(cookies.length > 0 && cookies != null){
for(Cookie cookie:cookies){
if(cookie.getName().equals("username")){
username = cookie.getValue();
}
if(cookie.getName().equals("password")){
password = cookie.getValue();
}
}
}
%>
<div class="container" style="width: 400px;">
<h3 style="text-align: center;">管理员登录</h3>
<form action="/login" method="post">
<div class="form-group">
<label for="user">用户名:</label>
<input type="text" name="user" class="form-control" id="user" placeholder="请输入用户名" value="<%=username%>"/>
</div>
<div class="form-group">
<label for="password">密码:</label>
<input type="password" name="password" class="form-control" id="password" placeholder="请输入密码" value="<%=password%>"/>
</div>
<div class="form-inline">
<input type="checkbox" name="rem" class="form-control" id="rem" value="rem"/>
<label for="rem">记住我</label>
</div>
<div class="form-inline">
<label for="vcode">验证码:</label>
<input type="text" name="verifycode" class="form-control" id="verifycode" placeholder="请输入验证码"
style="width: 120px;"/>
<a href="javascript:refreshCode()"><img src="checkCode" title="看不清点击刷新" id="vcode"/></a>
</div>
<hr/>
<div class="form-group" style="text-align: center;">
<input class="btn btn btn-primary" type="submit" value="登录">
</div>
</form>
<!-- 出错显示的信息框 -->
<div class="alert alert-warning alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert">
<span>×</span>
</button>
<strong>登录失败!</strong>
</div>
</div>
</body>
</html>