Cookie Session入门
为什么会有cookie和session?
由于客户端访问web页面一般分为三步:
1、客户端发起请求
2、服务器接收请求返回响应
3、客户端接收响应
由于http协议,各个请求响应之间的数据不能相互传递,所以就有了cookie和session用来在浏览器访问服务器的进程中保存数据和传输数据。
Cookie
1、cookie原理及细节
原理
Cookie基于响应头set-cookie和请求头cookie实现
例如bilibili:
我们可以看到在网页中cookie数据传输是利用“name=value”键值对方式实现的
相当于每次请求和响应都会带着cookie中这些键值对信息,方便前后端根据name调用cookie中value值。
细节
cookie存储中文数据:在tomcat8之后,cookie可以存储中文数据
如果想要一次存储多个cookie,需要设置多个cookie对象,使用response调用多次addcookie方法发送cookie
Cookie存储数据在客户端浏览器
浏览器对于单个cookie的大小有限制(4kb)以及对同一个域名下的总cookie数量也有限制(20个)
作用:
Cookie一般用于存储少量的不太敏感的数据
在不登陆的情况下,完成服务器对客户端的身份识别
2、cookie代码简单实现
package com.example.cookieandsession;
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("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie c = new Cookie("msg","hello");
resp.addCookie(c);
}
}
上面展示了如何创建一个新的cookie并且发送cookie的代码
3、cookie方法解析
获得cookie:
package com.example.cookieandsession;
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("/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie []cs = req.getCookies();
if(cs!=null){
for (Cookie c : cs) {
String name = c.getName();
String value = c.getValue();
System.out.println(name+":"+value);//从cookie中获取键值对并打印
}
}
}
}
设置cookie存活时间:
package com.example.cookieandsession;
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("/CookieDemo3")
public class CookieDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie c1 = new Cookie("msg","setMaxAge");
c1.setMaxAge(30);//设置时间为30秒
resp.addCookie(c1);
}
}
调用setMaxAge方法设置cookie的存活时间,单位是秒。该方法会使cookie存储到硬盘中,即使浏览器关闭也会持久性保存
如果设置为负值(默认值)cookie寿命与浏览器相同
如果设置为0,则销毁该cookie
设置cookie作用范围:
假设在一个服务器中部署了多个web项目,要想在这些web项目中共用同一个cookie,可以调用setPath(String path):设置cookie的获取范围,如果要共享,可以将path设置为“/”。
4、基于cookie实现用户自动登录以及显示用户上次登录时间
自动登录案例:
package servlet;
import dao.UserDao;
import domain.User;
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("/LoginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
//获取参数
String username = req.getParameter("username");
String password = req.getParameter("password");
String auto = req.getParameter("auto");//接收参数看用户是否选择了自动登录选项
if(auto!=null&&auto.equals("yes")){
//如果选择,则在cookie中添加username
Cookie cookieuser = new Cookie("username",username);
cookieuser.setMaxAge(60*60*24*7);//七天
resp.addCookie(cookieuser);
}else{
//如果选择了否,则清理cookie
Cookie cookie = new Cookie("username",username);
cookie.setMaxAge(0);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
}
用于接收cookie的代码:
Cookie []cookies = request.getCookies();//获取cookie
String username = null;
for (Cookie cookie : cookies) {
//如果用户选择了自动登录,则会生成一个寿命为一周,name为username的cookie
if(cookie.getName().equals("username")){
username = cookie.getValue();
}
}
if(username!=null){
//如果接收到了username,则重定向到已经登陆的页面
response.sendRedirect("/image/home.jsp?username="+username);
}else{
//如果没有,则重定向到未登陆的页面
response.sendRedirect("/image/notlogin.jsp");
}
登陆页面弹出上次登录时间案例:
package com.example.cookieandsession;
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;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet("/CookieTest")
public class CookieTest extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie []cookies = req.getCookies();
boolean flag = false;
if(cookies!=null&&cookies.length>0){
for (Cookie cookie : cookies) {
String name = cookie.getName();
if("lastTime".equals(name)){
resp.setContentType("text/html;charset=utf-8");
//有cookie,说明不是第一次访问
//获取cookie的事件并输出(网页输出)
String value = cookie.getValue();
//解码
value = URLDecoder.decode(value,"utf-8");
resp.getWriter().write("<h1>欢迎回来!你上次访问的时间为:"+value+"</h1>");
flag = true;
//设置Cookie的value
//获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//URL编码
String str_date = sdf.format(date);
str_date = URLEncoder.encode(str_date,"utf-8");
//重新设置cookie的value
cookie.setValue(str_date);
//设置cookie的存活时间
cookie.setMaxAge(60*60*24*30);
//重新发送cookie
resp.addCookie(cookie);
break;
}
}
}
if(cookies==null||cookies.length==0||flag==false){
//没有,第一次访问
//有cookie,说明不是第一次访问
resp.setContentType("text/html;charset=utf-8");
//设置Cookie的value
//获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = sdf.format(date);
Cookie cookie = new Cookie("lastTime",str_date);
str_date = URLEncoder.encode(str_date,"utf-8");
cookie.setValue(str_date);
//设置cookie的存活时间
cookie.setMaxAge(60*60*24*30);
resp.addCookie(cookie);
String value = cookie.getValue();
//解码
value= URLDecoder.decode(value,"utf-8");
resp.getWriter().write("<h1>您好!欢迎您首次访问!"+value+"</h1>");
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
}
Session
1、session原理及细节
原理:session是依赖于cookie的,当客户端访问服务器时,服务器会生成一个session对象,同时在cookie中添加一个JSSIONID,也就是session名,服务器底端会通过这个ID查找到服务器中对应的session对象以及数据。
细节:
session的默认失效时间是三十分钟, 如果想要设置session的失效时间,可以在tomcat的conf\web.xml中设置
<session-config>
<session-timeout>30</session-timeout>
<session-config>
更改sessiontime中的值就行。
2、session代码简单实现
package Session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取Session
HttpSession session = req.getSession();
//存储数据
session.setAttribute("msg","hello,session");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
}
cookie与session的区别
session存储数据在服务器端,cookie在客户端
1、session存储数据在服务器端,cookie在客户端
2、session没有数据大小限制,cookie有
3、session数据安全,cookie相对于没有那么安全
尾言:四月计划安排
这阶段任务很赶很繁重,而且蓝桥杯考完第二天小组就要考核,虽说学习任务紧赶慢赶学完了,但是算法落下不少,所以四月份打算在算法上多分配一些时间,争取明年冲个省一,其次就是每天按时睡觉作息规律一些,这阶段差点累死我。