1、Cookie出现的背景
http协议的请求是无状态的,客户端与服务器在通讯的时候,是无状态的,其实就是客户端在第二次来访的时候,服务器根本就不知道这个客户端有没有来访问过。为了更好的用户体验,更好的交互。
Cookie的简单使用
Cookie cookie = new Cookie("aa","bb");
response.addCookie(cookie);
Cookie[] cookies = request.getCookies();
if(cookies != null){
for(Cookie c : cookies){
String cookieName = c.getName();
String cookieValue = c.getValue();
System.out.println(cookieName + "=" + cookieValue);
}
}
Cookie的有效期
`默认情况下,关闭浏览器cookie就没有了。
cookie.setMaxAge(expiry),expiry以秒计算。
正值:表示在这个数字过后,cookie就会失效。
负值:表示关闭浏览器后,那么cookie就失效,默认值是-1赋值新的值
cookie.setValue(newValue);用于指定只有请求了指定的域名,才会带上该cookie
cookie.setDomain(“www.baidu.com”);用于指定只有访问该域名下的cookieDemo这个路径才会带上cookie
cookie.setPath("/CookieDemo");
案例:登录时间:
搜索Cookie的工具类
package login;
import javax.servlet.http.Cookie;
public class Tool {
public static Cookie findCookie(Cookie[] cookies,String name){
if(cookies != null){
for (Cookie cookie : cookies) {
if(cookie.getName().equals(name))
return cookie;
}
}
return null;
}
}
servlet
package login;
import java.io.IOException;
import java.util.Date;
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 loginServlet
*/
@WebServlet("/login")
public class loginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
if("admin".equals(username) && "123".equals(password)){
Cookie[] cookies = request.getCookies();
Cookie cookie = Tool.findCookie(cookies, "last");
if(cookie == null){
Cookie c = new Cookie("last",System.currentTimeMillis() + "");
c.setMaxAge(60 * 60);
response.addCookie(c);
response.getWriter().write("歡迎您,"+ username);
}else{
long lastVisitTime =Long.parseLong(cookie.getValue());
response.getWriter().write("歡迎您,"+ username +",上次的來訪時間是:"+ new Date(lastVisitTime));
cookie.setValue(System.currentTimeMillis() + "");
response.addCookie(cookie);
}
}else{
response.getWriter().write("登陆失败!!!");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
由于Cookie会保存在客户端上,所以有安全隐患问题,还有一个问题,Cookie的大小与个数有限制,为了解决这个问题出现了session。
2、Session
会话,Session是基于Cookie的一种会话机制。Cookie是服务器返回一小份数据给客户端,并且存放在客户端上。Session是将数据存放在服务器端。
常用的API
HttpSession session = request.getSession();
//得到会话id
String id = session.getId();
//存值
session.setAttribute(name,value);
//取值
session.getAttribute(name);
//移除值
session.removeAttribute(name);
session的创建和销毁
创建:
如果有在servlet里面调用了request.getSession();
销毁:
session是存放在服务器内存中的一份数据,当然可以持久化,.redis,即使关了浏览器,session也不会销毁。
1、关闭服务器
2、session会话时间过期,默认有效期:30分钟。