======================
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去,这样就有了自动登录这样的东西,Cookie的用户还有很多
Cookie获取上一次登录时间小例子
html里
提交一个账号和密码即可
<h1>Welcome</h1>
<form action="a">
帐号: <input type="text" name="user"/><br/>
密码: <input type="text" name="pass"/><br/>
<input type="submit"/>
</form>
在web.xml里
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
在servlet里
public class MyServlet extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// 设置写出编码和浏览器编码
response.setContentType("text/html;charset=utf-8");
// 获取参数
String user = request.getParameter("user");
String pass = request.getParameter("pass");
if ("admin".equals(user) && "123".equals(pass))
{
// 先获取所有的Cookie,第一次的时候还没有向客户端写入Cookie
Cookie[] c = request.getCookies();
// 返回我们自己的Cookie对象,Tools_Cookies是一个简单的查找工具类
Cookie cookie1 = Tools_Cookies.findCookie(c, "last");
// 如果是第一次登录,那么就等于null
if (cookie1 == null)
{
// 取现在的时间
String lastTime = Long.toString(System.currentTimeMillis());
// 创建Cookie
Cookie cookie2 = new Cookie("last", lastTime);
// 设置Cookie的缓存时间,以秒为单位,不管关不关浏览器以时间为准
// cookie默认时间是-1,关闭浏览器cookie就没了
cookie2.setMaxAge(60 * 60 * 24);
// 设置只有访问了指定的路径才会携带cookie
// cookie2.setPath("/Servlet_002_Cookie_Session");
// 添加cookie,发送给客户
response.addCookie(cookie2);
response.getWriter().write("登录成功");
}
// 但是如果不是第一个登录,是带了cookie登录的
else
{
long lastTime = Long.parseLong(cookie1.getValue());
// 转换到Date是方便我们观看
response.getWriter().write("上次登录是" + new Date(lastTime));
// 然后重置我们的最后的时间,应该是现在登录的时候了
cookie1.setValue(Long.toString(System.currentTimeMillis()));
// 记住最后一定要添加进去,这样客户那边才能更新
response.addCookie(cookie1);
}
} else
{
response.getWriter().write("登录失败");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGet(request, response);
}
}
上面用到的是Tools工具类,这个并不难
public class Tools_Cookies
{
//在多个Cookies中找到并返回我们的Cookie
public static Cookie findCookie(Cookie c[],String cookieNmae)
{
if (cookieNmae!=null && c!=null)
{
for (Cookie cookie : c)
{
if (cookieNmae.equals(cookie.getName()))
{
return cookie;
}
}
}
return null;
}
}
Cookie获取浏览记录
在_002_record.jsp里
这里牵扯了一点jsp内容,就简单的说一下
<%@page import=xxx %> 这句可以导入我们的工具类
<%@page import="com.servlet.Tools_Cookies"%>
<%@ 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>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="a?id=1">商品1</a><br />
<a href="a?id=2">商品2</a><br />
<a href="a?id=3">商品3</a><br />
<a href="a?id=4">商品4</a><br />
<a href="a?id=5">商品5</a><br />
<a href="a?id=6">商品6</a>
<br/><br/><br/><br/><br/>
<!-- 下面应该是浏览器记录 -->
<h1>下面是浏览器记录</h1><br/>
<%
//获取cookie,这里的request暂不解释,等jsp的时候再解释
//现在可以理解为一个全局的对象
Cookie[] cookie1=request.getCookies();
Cookie cookie2=Tools_Cookies.findCookie(cookie1,"histroy");
//第一次浏览
if (cookie2==null)
{
%>
<h2>你还没有浏览任何商品</h2>
<%
}
//如果不是第一次浏览
else
{
//那么就获取cookie的数值,cookie我们会用#拼起来,并在这里切割
String []ids=cookie2.getValue().split("#");
for(String id:ids)
{
%>
<a href="#">商品<%=id%></a>
<%
}
}
%>
<br /><h1> <a href="clear">清除浏览记录</a></h1>
</body>
</html>
在web.xml里
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
<!-- 清理Cookie的Servlet -->
<servlet>
<servlet-name>clearHistory</servlet-name>
<servlet-class>com.servlet.ClearHistoryServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>clearHistory</servlet-name>
<url-pattern>/clear</url-pattern>
</servlet-mapping>
在MyServlet里
public class MyServlet extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// 获取参数
String id = request.getParameter("id");
// 获取cookie
Cookie[] cookie1 = request.getCookies();
Cookie cookie2 = Tools_Cookies.findCookie(cookie1, "histroy");
// 第一次浏览
if (cookie2 == null)
{
// 如果是第一次浏览,那么新建cookie,新建的cookie就是点击的id
Cookie cookie3 = new Cookie("histroy", id);
response.addCookie(cookie3);
}
// 如果不是第一次浏览
else
{
// 那么就获取cookie的数值
String ids = cookie2.getValue();
// 让现在浏览的商品和以前浏览的商品的id给加起来,实现cookie叠加
cookie2.setValue(ids + "#" + id);
response.addCookie(cookie2);
}
// 重定向跳转页面,因为没有其他页面,所以我们还是跳到本身的页面来
response.sendRedirect("_002_record.jsp");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGet(request, response);
}
}
然后是清理Cookie
在ClearHistoryServlet里
public class ClearHistoryServlet extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//添加空的数值即可
Cookie cookie1=new Cookie("histroy","");
//设置立即删除
cookie1.setMaxAge(0);
response.addCookie(cookie1);
//清楚完要跳转回去
response.sendRedirect("_002_record.jsp");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGet(request, response);
}
}
上面的小例子使用到了Cookie,其实Cookie也就那么多方法,下面是看Session
Session
注意
session确实是存放在服务器中了,但是当我们关闭了浏览器,那么就会重新开启 一次会话,这时候之前的session也就访问不到了,
虽然它还存在服务器,这个要特别注意
下面是基于Session实现购物车功能
在_003_buy.jsp里
<a href="a?id=1">商品1</a><br />
<a href="a?id=2">商品2</a><br />
<a href="a?id=3">商品3</a><br />
<a href="a?id=4">商品4</a><br />
<a href="a?id=5">商品5</a><br />
<a href="a?id=6">商品6</a>
<br/><br/><br/><br/><br/>
在_003_cart.jsp里,这是购物车页面
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@page import="java.util.Map"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h2>你的购物车如下:</h2>
<%
//先获取到map(购物车空间) getAttribute是获取指定属性
Map<String,Integer> map1=(Map<String,Integer>)session.getAttribute("cart");
if(map1!=null)
{
//先获取map集合的所有键的set集合,直接遍历
for(String key:map1.keySet())
{
int value=map1.get(key);
%>
<h3>名称: <%=key %> 数量:<%=value %></h3>
<%
}
}
%>
<br/><br/>
<h2><a href="clear">清空购物车</a></h2>
</body>
</html>
在web.xm里
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
<!-- 清空购物车 -->
<servlet>
<servlet-name>clearHistory</servlet-name>
<servlet-class>com.servlet.ClearHistoryServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>clearHistory</servlet-name>
<url-pattern>/clear</url-pattern>
</servlet-mapping>
在MyServlet里
public class MyServlet extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// 设置编码
response.setContentType("text/html;charset=utf-8");
// 返回唯一的会话id字符串,每个浏览器不同
System.out.println(request.getSession().getId());
// 获取商品id
int id = Integer.parseInt(request.getParameter("id"));
String[] names =
{ "苹果", "梨子", "外星人", "华硕", "神舟", "戴尔" };
String name = names[id - 1];
// 利用session.getAttribute获取购物车,相当于cookie的getCookie
Map<String, Integer> map1 = (Map<String, Integer>) request.getSession().getAttribute("cart");
// 如果是第一次使用购物车
if (map1 == null)
{
// 把一个map存到session里
map1 = new HashMap<String, Integer>();
//设置属性,相当于addCookie
request.getSession().setAttribute("cart", map1);
}
// 如果购物车已经有我们选中的商品了
if (map1.containsKey(name))
{
// 数量+1
map1.put(name, map1.get(name) + 1);
}
// 购物车无商品
else
{
map1.put(name, 1);
}
response.getWriter().write("<a href='_003_buy.jsp'><h2>继续购物</h2></a><br/>");
response.getWriter().write("<a href='_003_cart.jsp'><h2>去购物车结算</h2></a>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGet(request, response);
}
}
下面是清空购物车的ClearHistoryServlet
public class ClearHistoryServlet extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//从seeison移除某一个数据
request.getSession().removeAttribute("cart");
//或者强制干掉会话
request.getSession().invalidate();
//跳转回页面
response.sendRedirect("_003_cart.jsp");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGet(request, response);
}
}