009 Cookie和Session

======================

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> &nbsp;
	      <%
	       }
	      
		}
    
	%>
	
	<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);
	}
}

猜你喜欢

转载自blog.csdn.net/yzj17025693/article/details/82835566
009
今日推荐