Cookie
前言
因为cookie、session、token本身就是很容易混淆的东西,这里不放在一块了,所以我们先来理解下cookie是什么,怎么去简单的使用下, 看前点个赞,养成好习惯;👍
书接上回:
【JavaWeb】-Tomcat、Eclipse使用项目搭建(一)
【JavaWeb】-mysql、jdbc、dbcp使用(二)
【JavaWeb】-MVC、Servlet学习(三)
介绍
cookie是啥,来自百度百科:
我觉得多少都了解cookie吧,因为是不是有时候好网站都在拦截Cookie或者我们见过Cookie,在哪里呢?
打开浏览器,右键点击检查,这里存放了很多Cookie,Cookie就是与服务器沟通时候的自己带的一些信息,其实就是用户名和密码,我们判断用户是否登录,以及用户登录网站留下的信息。
这些相信大家都知道,我们通常第一次登录网站需要输入账号密码,那第二次登陆的时候就都会留下我们第一次的信息,那下面我们要说的三个东西都是实现这项功能的技术,那么我们顺其往下,我们先来学习Cookie;
环境准备
那这次我们做一下环境准备:大家平常都在哪里白嫖这种网页模板呀,博主反正找到的都不好看,如果有请在博主评论区里艾特我一下,在线卑微! 找一个好看的登录模板;
这里我们使用就是保存用户登录账号和名称做演示:
我们首先设置下过滤编码创建一个filter过滤全部编码为utf-8:
package filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
/**
* Servlet Filter implementation class CharasetFilter
*/
@WebFilter("/*")
public class CharasetFilter implements Filter {
/**
* Default constructor.
*/
public CharasetFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
System.out.println("经过过滤");
chain.doFilter(request, response);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
我们创建一个MyLoginServlet.java:
package servlet;
import java.io.IOException;
import java.net.URLEncoder;
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;
/**
* Servlet implementation class MyLoginServlet
*/
@WebServlet("/MyLoginServlet")
public class MyLoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public MyLoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//String name = ;
String pass = request.getParameter("password");
Cookie name = new Cookie("name", URLEncoder.encode(request.getParameter("username"), "UTF-8"));
Cookie passCookie = new Cookie("pass", pass);
//设置时间24小时
name.setMaxAge(60*60*24);
passCookie.setMaxAge(60*60*24);
response.addCookie(name);
response.addCookie(passCookie);
response.sendRedirect("index.jsp");
//request.getRequestDispatcher("ToIndexServlet").forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
我们的index.jsp页面,发现了没有我们的jsp页面可以写java代码,后面我们细说jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>主界面</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
if (cookies != null) {
// 我们可以遍历下我们的cooike看看
for (Cookie cookie : cookies) {
out.println(cookie.getName() + "<br/>");
out.println(cookie.getValue() + "<br/>");
out.println("==============<br/>");
}
}
%>
这里是主界面
</body>
</html>
这里我们不跟数据库打交道,随便的登录信息即可,登录页面登录:
通过开发者模式,我们查看网络请求,我们看到了服务器给我们的响应请求设置了cookie:
登录进入index.jsp页面,我们发现我们所有携带的cookie就都在这里了:
当我们关闭浏览器再次进入,我们发现我们的信息还在,因为上面我们设置了cookie有效时间为24小时,所以我们退出之后登录信息依然存在,这样通过cookie保存信息我们就完成了:
这里我们也同样可以根据浏览器开发者看到cookie信息:
这里发现我们cookie除了设置时间,还可以设置很多信息(来自菜鸟教程):
Servlet Cookie 方法
以下是在 Servlet 中操作 Cookie 时可使用的有用的方法列表。
序号 | 方法 & 描述 |
---|---|
1 | public void setDomain(String pattern) 该方法设置 cookie 适用的域,例如 runoob.com。 |
2 | public String getDomain() 该方法获取 cookie 适用的域,例如 runoob.com。 |
3 | public void setMaxAge(int expiry) 该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效。 |
4 | public int getMaxAge() 该方法返回 cookie 的最大生存周期(以秒为单位),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。 |
5 | public String getName() 该方法返回 cookie 的名称。名称在创建后不能改变。 |
6 | public void setValue(String newValue) 该方法设置与 cookie 关联的值。 |
7 | public String getValue() 该方法获取与 cookie 关联的值。 |
8 | public void setPath(String uri) 该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。 |
9 | public String getPath() 该方法获取 cookie 适用的路径。 |
10 | public void setSecure(boolean flag) 该方法设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送。 |
11 | public void setComment(String purpose) 设置cookie的注释。该注释在浏览器向用户呈现 cookie 时非常有用。 |
12 | public String getComment() 获取 cookie 的注释,如果 cookie 没有注释则返回 null。 |
我们也可以手动删除cookie信息:
这样我们的name就没有了:
那这里就是cookie的使用,我们发现cookie是不是有点儿不安全,可以看到账号和密码,如果这些信息被别人一下看到,或者拦截一下,那不就太明文了,对吧,通过cookie我们是将我们的存储信息交给了客户端,那我们如果交给服务端去做呢?,下面就到了session了,我们看看什么是session;
那老规矩都看到这里了,还不点个关注,那后面更新了又找不到了,预留:{session}