cookie概述及cookie实现10天内免登陆功能
cookie的作用:
cookie用于保存会话状态到客户端。保留在以下两个地方:
- 浏览器的缓存中;
- 客户端硬盘文件中。
cookie在java中被当作一个类来处理:javax.servlet.http.Cookie;
cookie不仅仅存在于Java中,只要是web开发,B/S架构,只要是基于http协议,就有cookie。
常见的功能:保留购物车上的商品,多天免登陆.......
1.将cookie存放在浏览器缓存中
cookie对象可以通过构造方法直接创建,由两部分组成,name和value;
//第一个参数为cookie名字,第二个参数为cookie的值
new Cookie(String,String);
这种方式创建的cookie会保存在浏览器缓存中,浏览器关闭,则cookie消失。
当浏览器发起请求时,服务器就会给浏览器发送一个cookie,可以发送多个,客户端也可以获取到服务器端发送的cookie:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>cookie</title>
</head>
<body>
<a href="/servlet_01_javaweb/cookie01">服务器发送cookie给客户端浏览器</a>
</body>
</html>
package com.dh.cookie;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Cookie01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie1 = new Cookie("cookie1", "value1");
//服务器发送cookie
response.addCookie(cookie1);
//客户端可以获取cookie
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
//获取cookie的名字
String cookieName = cookie.getName();
//获取cookie的值
String cookieValue = cookie.getValue();
System.out.println(cookieName + "=" + cookieValue);
}
}
}
cookie和访问的路径有关系。
cookie会和特定的路径绑定在一起,第一次请求,服务器会给客户端浏览器发送cookie,只要没有结束这次会话,再次请求了特定路径,客户端浏览器就会携带绑定的cookie一起发送给服务器。
如:
设置cookie关联的路径
Cookie cookie1 = new Cookie("cookie1", "value1");
//在发送cookie之前可以指定cookie关联路径
cookie1.setPath(request.getContextPath()+"/a");
//服务器发送cookie
response.addCookie(cookie1);
此时,只有访问与http://localhost:8080/servlet_01_javaweb/a有关的路径,客户端才能发送特定的cookie给服务器。
2.将cookie保存在浏览器硬盘文件中
只要设置cookie的有效时长,并且有效时长>0时,cookie被保存到客户端的硬盘文件中。
Cookie cookie1 = new Cookie("cookie1", "value1");
cookie1.setMaxAge(60 * 60);//单位为秒,即将cookie的有效时长设置为1小时
response.addCookie(cookie1);
当cookie保存到了客户端的硬盘文件中,关闭浏览器也不会清除cookie,只有到了有效时间cookie才会被清除。
但是可以自己删除cookie:
将cookie的有效时间设置为0,即为删除cookie。
//删除cookie
cookie1.setMaxAge(0);
3.cookie实现10天免登陆
先捋一下逻辑:
当用户输入一个地址的时候,先判断是否携带cookie,如果携带了cookie再判断cookie的值,再判断用户名和密码是否正确,如果都正确的话就直接跳转到主页,不需要登陆;
如果没有携带cookie信息的话,就直接跳转到登陆页面,第一次登陆成功,如果勾选了十天免登录,服务器就发送cookie,设置有效时间,保存到客户端硬盘文件中。
web.xml:
<!-- 设置欢迎页面-->
<welcome-file-list>
<welcome-file>checkLogin</welcome-file>
</welcome-file-list>
<!-- 登陆-->
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.dh.cookie.Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<!-- 检查是否携带cookie-->
<servlet>
<servlet-name>checkLogin</servlet-name>
<servlet-class>com.dh.cookie.CheckLogin</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>checkLogin</servlet-name>
<url-pattern>/checkLogin</url-pattern>
</servlet-mapping>
登陆页面:lg.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登陆页面</title>
</head>
<body>
<form action="/servlet_01_javaweb/login" method="post">
用户名:<input name="username" type="text"><br>
密码:<input name="password" type="password"><br>
<input name="tenDays" type="checkbox" value="ok">十天内免登陆<br>
<input type="submit" value="登陆">
</form>
</body>
</html>
登陆成功页面:success.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>success</title>
</head>
<body>
登陆成功!
</body>
</html>
登陆失败页面:fail.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>fail</title>
</head>
<body>
用户名或密码错误,请
<a href="/servlet_01_javaweb/lg.html">重新登陆</a>
</body>
</html>
CheckLogin
package com.dh.cookie;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CheckLogin extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取cookie
Cookie[] cookies = request.getCookies();
//取出cookie中的值
String username = null;
String password = null;
for (Cookie cookie : cookies) {
String cookieName = cookie.getName();
if("username".equals(cookieName)){
username = cookie.getValue();
}
if("password".equals(cookieName)){
password = cookie.getValue();
}
}
if("zhangsan".equals(username) && "123".equals(password)){
response.sendRedirect("/servlet_01_javaweb/success.html");
}else {
response.sendRedirect("/servlet_01_javaweb/lg.html");
}
}
}
Login:
package com.dh.cookie;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Login 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 {
String username = request.getParameter("username");
String password = request.getParameter("password");
String tenDays = request.getParameter("tenDays");
//此处不连接数据库
//用户名和密码正确
if ("zhangsan".equals(username) && "123".equals(password)) {
if ("ok".equals(tenDays)) {
//将用户信息存储到cookie中,并且关联路径和设置有效时间
Cookie cookie1 = new Cookie("username", username);
Cookie cookie2 = new Cookie("password", password);
cookie1.setPath(request.getContextPath());
cookie2.setPath(request.getContextPath());
cookie1.setMaxAge(60 * 60 * 24 * 10);
cookie2.setMaxAge(60 * 60 * 24 * 10);
//服务器发送cookie给客户端浏览器
response.addCookie(cookie1);
response.addCookie(cookie2);
}
//跳转到主页
response.sendRedirect("/servlet_01_javaweb/success.html");
} else {
//跳转到登陆失败页面
response.sendRedirect("/servlet_01_javaweb/fail.html");
}
}
}
以上就能实现10天内免登录了。登陆成功后,关闭浏览器,输入http://localhost:8080/servlet_01_javaweb/就能直接跳转到success.html了。