Web基础之Cookie对象与Session对象(一)
一、Cookie对象和Session对象简介:
浏览器请求服务端是一种无状态链接,即每一次请求都是独立的;
Cookie和Session是保持会话的两种技术;
Cookie:客户端会话保持技术
Session:服务端会话保持技术
二、Cookie对象详解
1. Cookie中的数据,如何传递到客户端?
答:服务器端创建的Cookie,会通过响应头 Set-Cookie,传递给客户端。
2. Cookie何时失效?
2. Cookie何时失效?
答:Cookie 有一个maxAge属性,该属性指定该Cookie的有效期,时间单位是秒。maxAge默认是 -1,·
表示关闭浏览器即失效。
3. Cookie中的数据,又是如何被带到服务器?
表示关闭浏览器即失效。
3. Cookie中的数据,又是如何被带到服务器?
答:如果同一个会话中,以前的某一次请求,服务器给客户端响应了Cookie,那么,该客户端后续对同一个
WEB APP 的请求都会带上该Cookie的数据。具体来说,是通过请求头Cookie来实现的。
WEB APP 的请求都会带上该Cookie的数据。具体来说,是通过请求头Cookie来实现的。
通过 Cookie 的 domain 和 path 属性确定当前请求是否需要带上这个Cookie。
三、Cookie实例:七天内记住我(用户名)功能实现
loginandrmb.jsp页面
<%@age import="org.apache.jasper.tagplugins.jstl.core.ForEach"%>
<%@ 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 http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录界面</title>
</head>
<body>
<!-- Java代码区:获取所有的响应头的Cookie,看其中是否有名为myuser的Cookie,
如果有,则获取Cookie中保存的用户名-->
<%
String userName=null;
Cookie[] cookies =request.getCookies();
if(cookies!=null && cookies.length>0){
for(Cookie cookie:cookies){
if(cookie.getName().equals("myuser")){
userName=cookie.getValue();
}
}
}
%>
<form action="http://localhost:8080/MyCookieAndSession/login"
method="POST">
<!-- 把Cookie中保存的用户名设置上去-->
用户名:<input type="text" name="userName"
value="<%=userName==null?"":userName%>"><br />
密 码:<input type="password" name="passWord"><br />
<!-- 默认选中-->
<input type="checkbox" name="rmbme" value="yes"
<%=userName==null?"":"checked"%>>七天内记住我<br> <input
type="submit" value="登录">
</form>
</body>
</html>
LoginServlet逻辑处理
package com.usc.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//设置请求编码
req.setCharacterEncoding("UTF-8");
//获取参数
String userName =req.getParameter("userName");
String passWord =req.getParameter("passWord");
String rmbme=req.getParameter("rmbme");
//简单的登录校验
if("BlueSky".equals(userName) && "123".equals(passWord)){
//创建Cookie
Cookie cook =new Cookie("myuser", userName);
//判断是否勾选七天内记住我
if(rmbme!=null){
//如果勾选了,则设置有限期为7天
cook.setMaxAge(24*3600);
}else{
//否则设置达到浏览器立即失效
cook.setMaxAge(0);
}
//保存用户名到REQUEST作用域
req.setAttribute("userName", userName);
//给客户端添加Cookie响应头
resp.addCookie(cook);
//转发请求
req.getRequestDispatcher("/Loginwelcome.jsp").forward(req, resp);
}else{
//否则转到错误处理页
resp.sendRedirect("/error.jsp");
}
}
}
<%@ 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 http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>欢迎界面</title>
</head>
<body>
欢迎您:<%=request.getAttribute("userName") %><br>
</form>
</body>
</html>
<%@ 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 http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>错误处理界面</title>
</head>
<body>
登录出现错误!
</form>
</body>
</html>
web.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>MyCookieAndSession</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.usc.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
四、运行效果:
第一次登录不选中七天内记住我
登录成功
新建一个会话,输入同样的地址,会发现并没有记住用户名,再次登录,并勾选七天内记住我
登录成功
再次新建会话:会发现用户名已经记住,并默认选中了七天内记住我
五、在Chrome浏览器中查看我们自己的Cookie信息
在搜索框中搜索local,这里可以查看本地的Cookie信息,创建时间以及过期时间,这里由于程序中设置的过期时间是
24*3600,忘记再*7天了,所以,变成了一天过期;
六、总结:
Cookie和Session是保持会话的两种技术,一种是客户端保持,一种是服务端保持;
Cookie技术主要是了解Cookie的基本原理,Cookie的创建,发送,获取以及Cookie的过期时间设置,路径设置等;
其实,在我们的生活中Cookie和Session的案例比比皆是,比如记住用户名,购物车等等;
学无止境!共勉!