程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。
例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。
Web应用程序是使用HTTP协议传输数据的,HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。
要跟踪该会话,必须引入一种机制,Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
Cookie是不能跨域的。
1.-1:负值表示不会存储cookie,浏览器退出就会清除cookie。
正值表示存储多少秒。
2.访问资源的路径:/(所有资源都可以访问) 如果是/a/b,则/a不能访问cookie,/a/b/c可以访问(向下访问)。
3.访问域:www.jd.com下产生的cookie,www.taobao.com不能访问其cookie。cookie无法设置除当前域名或其父域名之外的domain,因为cookie无法进行跨域访问,这是浏览器对于cookie的保护。
如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。
domain为空,默认为当前域名。
<%@ page import="java.net.URLDecoder" %><%--
Created by IntelliJ IDEA.
User: lenovo
Date: 2019/9/10
Time: 9:49
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登陆界面</title>
</head>
<body>
<h3>用户登录</h3>
<%
String value01="";
String value02="";
String value03="";
//获取请求的Cookie
Cookie[] cookies = request.getCookies();
//cookies不为null,表示已经存储了数据
if(cookies!=null){
for (int i = 0; i <cookies.length ; i++) {
if("ga01".equals(cookies[i].getName())){
//对数据进行解码
value01 = URLDecoder.decode(cookies[i].getValue(),"utf-8");
}
if("ga02".equals(cookies[i].getName())){
value02 = cookies[i].getValue();
value03="checked";
}
}
}
%>
<form action="servlet/LoginServlet01" method="post">
<p>
账号:<input type="text" name="username" value="<%=value01%>" />
</p>
<p>
密码:<input type="password" name="pwd" value="<%=value02%>" />
</p>
<p>
<input type="checkbox" name="ch" value="yes" <%=value03%>/>10天免登录
</p>
${message}
<p>
<input type="submit" value="提交" />
</p>
</form>
</body>
</html>
//该注解相当于在web.xml中编写的servlet路径
@WebServlet(urlPatterns = "/servlet/LoginServlet01")
public class LoginServlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//(1)根据name获取前台页面中的数据
String zh=request.getParameter("username");
String pwd=request.getParameter("pwd");
String ch=request.getParameter("ch");
//(2)处理数据(进行判断)
boolean flag=false;
if("嘎".equals(zh)&&"smile".equals(pwd)){
flag=true;
}
//(3)做出响应
if(flag){
//对相应的数据进行编码
String encode = URLEncoder.encode(zh, "utf-8");
//申请Cookie
Cookie cookie01=new Cookie("ga01",encode);
Cookie cookie02=new Cookie("ga02",pwd);
//如果复选框已勾选
if("yes".equals(ch)){
//持续时间-->单位s
cookie01.setMaxAge(60*60*24*10);
cookie02.setMaxAge(60*60*24*10);
}else {
cookie01.setMaxAge(0);
cookie02.setMaxAge(0);
}
//适用范围
cookie01.setPath("/jsp01");
cookie02.setPath("/jsp01");
//响应给客户
resp.addCookie(cookie01);
resp.addCookie(cookie02);
//重定向
resp.sendRedirect("../success.jsp");
}else {
request.setAttribute("message","登录失败");
//转发
request.getRequestDispatcher("/Login.jsp").forward(request,resp);
}
}
}