Cookie
cookie是服务器生成给客户端的,并且存储在客户端的小数据
- 为什么要有这个cookie的存在?
http的请求是无状态的,即,客户端在第二次来访服务器时,服务器根本不知道客户端来过。(自动登录、大数据分析需要)
- 添加cookie给客户端&获取客户端发来的cookie
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//第一次访问服务器发送cookie给客户端
Cookie cookie = new Cookie("cookie1", "hello");
//给响应添加一个cookie
resp.addCookie(cookie);
resp.setContentType("text/html; charset=UTF-8");
resp.getWriter().write("请求成功");
//第二次来访,获取客户端带过来的cookie
Cookie[] cookies = req.getCookies();
if(null != cookies) {
for (Cookie c : cookies) {
System.out.println(c.getName());
System.out.println(c.getValue());
}
}
}
在浏览器中查看cookie:
-
常用方法
关闭浏览器后,cookie就没有了。 —> 针对没有设置cookie的有效期。
// expiry: 有效 以秒计算。
//正值 : 表示 在这个数字过后,cookie将会失效。
//负值: 关闭浏览器,那么cookie就失效, 默认值是 -1cookie.setMaxAge(60 * 60 * 24 * 7);//一周 //赋值新的值 //cookie.setValue(newValue); //用于指定只有请求了指定的域名,才会带上该cookie cookie.setDomain(".itheima.com"); //只有访问该域名下的cookieDemo的这个路径地址才会带cookie cookie.setPath("/CookieDemo");
-
显示最近访问时间
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
resp.setContentType("text/html; charset=UTF-8");
if("bela".equals(username) && "abc123".equals(password)) {
Cookie[] cookies = req.getCookies();
Cookie cookie = CookieUtil.findCookie(cookies, "last");
if(null == cookie) {//第一次访问
Cookie c = new Cookie("last", System.currentTimeMillis() + "");
c.setMaxAge(60 * 60);//设置一个小时候过期
resp.addCookie(c);
resp.getWriter().write("欢迎" + username + "登录");
}else {
long lastTime = Long.parseLong(cookie.getValue());
resp.getWriter().write("欢迎" + username + ",上次登录时间" + new Date(lastTime));
cookie.setValue(System.currentTimeMillis() + "");
resp.addCookie(cookie);
}
}
}
CookieUtil:
public class CookieUtil {
public static Cookie findCookie(Cookie[] cookie, String name) {
if(null != cookie) {
for (Cookie c : cookie) {
if(name.equals(c.getName())) {
return c;
}
}
}
return null;
}
}
顺一下思路,一开始服务器获取到了用户名密码信息,并设置好编码形式,请求获取客户端的所有cookie,寻找是否有一个叫last的cookie数据,若没有则该客户端是第一次访问,服务器需要生成这样一个cookie数据给客户端,让它下次再访问时,服务器可以识别;当发现该cookie存在时,代表二次访问,这个时候服务器只需要重新更新last的cookie的value再返回给客户端就可以。
- 清除浏览记录
即清除Cookie, 删除cookie是没有delete方法的,只有设置maxAge 为0
Cookie分类
- 分类
-
会话Cookie
默认情况下,关闭了浏览器cookie就会消失。 -
持久Cookie
在一定时间内,都有效,并且会保存在客户端上。cookie.setMaxAge(0); //设置立即删除 cookie.setMaxAge(100); //100 秒
- cookie的安全问题
cookie保存在客户端上,存在安全隐患,并且有大小个数限制,故引出了session。
Session
Session是基于Cookie的一种会话机制。Cookie是服务器返回给客户端的一小份数据,保存在客户端;Session是数据存放在服务器端。
Session会在cookie里面添加一个字段 JSESSIONID,是tomcat服务器生成。
- 常用API
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//session的创建
HttpSession session = req.getSession();
//得到回话ID
String id = session.getId();
//存值
session.setAttribute("hello", "world");
//取值
Object value = session.getAttribute("hello");
System.out.println(value);//world
//删除session值
session.removeAttribute("hello");
System.out.println(session.getAttribute("hello"));//null
}
- 何时创建销毁
Servlet中调用 req.getSession();时创建
Session是保存在服务器的数据,即使关闭浏览器也不会销毁,销毁真正方法两个:- 关闭服务器。
- session回话时间过期,一般默认30分钟销毁,服务器规定的。
- 模拟购物车
product_list.jsp:商品列表
<body>
<a href="CartServlet?id=0"><h3>华为</h3></a><br>
<a href="CartServlet?id=1"><h3>vivo</h3></a><br>
<a href="CartServlet?id=2"><h3>oppo</h3></a><br>
<a href="CartServlet?id=3"><h3>小米</h3></a><br>
<a href="CartServlet?id=4"><h3>苹果</h3></a><br>
</body>
CartServlet.Servlet:添加进购物车
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
String[] names = {"华为", "vivo", "oppo", "小米", "苹果"};
int id = Integer.parseInt(request.getParameter("id"));
HttpSession session = request.getSession();
String name = names[id];
//获取购物车存放的货品信息
Map<String, Integer> map = (Map<String, Integer>) session.getAttribute("cart");
if(null == map) {
map = new LinkedHashMap<String, Integer>();
session.setAttribute("cart", map);
}
if(map.containsKey(name)) {
map.put(name, map.get(name) + 1);
}else {
map.put(name, 1);
}
response.getWriter().write("<a href='product_list.jsp'><h1>继续购物</h1></a>");
response.getWriter().write("<a href='Cart.jsp'><h3>结算</h3></a>");
}
Cart.jsp:显示当前购物车信息
<body>
<h1>购物车商品如下</h1>
<hr>
<%
Map<String, Integer> map = (Map<String, Integer>) session.getAttribute("cart");
if(null != map) {
for(String key : map.keySet()) {
%>
<h3><%=key %><%=map.get(key) %>个</h3>
<%
}
}
%>
<a href="Clear">清空购物车</a>
</body>
ClearCart:清空购物车
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.invalidate();//强制删除,啥都没了
//session.removeAttribute("cart");//移除某一项
resp.sendRedirect("Cart.jsp");
}