文章目录
Cookie、Session
1、会话
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
2、保存会话的两种技术
Cookie
- Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会**携带各自的数据(Cookie)**去。这样,web资源处理的就是用户各自的数据了。
Session
- Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。Session对象由服务器创建,开发人员可以调用request对象的getSession()方法得到session对象。
3、Cookie
3.1、Cookie相关API
HttpServletResponse 类的方法:
//添加Cookie对象到当前response对象中,此方法可以被调用多次
void addCookie(Cookie c);
HttpServletRequest 类的方法:
Cookie[] getCookies();//返回Cookie数组,如果请求中没有Cookie,那么该方法返回null。
Cookie 类的方法:
public Cookie(String name,String value);//cookie的构造方式
String getName();//获取cookie的名称
String getValue();//获取cookie的值
void setMaxAge(int expiry);//设置cookie有效期
void setPath(String url);//设置有效路径
void setDomain(String pattern);//设置有效域名
- 示例:在网页显示用户上次登录时间
public class CookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//统一编码,防止出现乱码问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//获取cookie数组
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if(cookies[i].getName().equals("lastLoginTime")){
//将cookie数据写到网页
resp.getWriter().write("您上次访问本站时间:"+ new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss E").format(new Date(Long.parseLong(cookies[i].getValue()))));
break;
}
}
}else {
resp.getWriter().write("这是您今天第一次访问本站!");
}
//重新创建cookie,将当前时间戳存到cookie中
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
//获取从当前时间到当日24:00:00的秒数 //复习Calendar抽象类用法
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,0);
calendar.set(Calendar.MINUTE,0);
calendar.set(Calendar.SECOND,0);
calendar.add(Calendar.DAY_OF_MONTH,1);
long endTime = calendar.getTimeInMillis();
int effectiveTime = (int) ((endTime - System.currentTimeMillis())/1000);
System.out.println(effectiveTime);
//设置cookie有效期为到当日24:00:00
cookie.setMaxAge(effectiveTime);
//添加cookie到浏览器
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
-
测试访问
- 第一次访问
- 第二次访问
- 第一次访问
3.2、删除Cookie
- 不设置有效期(默认
maxAge = -1
),相当于cookie.setMaxAge(-1)
; ,关闭浏览器,自动失效 - 设置有效期为0,即
cookie.setMaxAge(0);
3.3、编码解码
URLEncoder.encode(String s,String enc) //编码
URLDecoder.decode(String s,String enc) //解码
/*---------------------示例-----------------------*/
Cookie cookie = new Cookie("hello", URLEncoder.encode("你好", "utf-8"));
URLDecoder.decode(cookie.getValue(),"utf-8");
4、Session
4.1、Session相关API
request.getSession() //获取session
String getId() //获取sessionId;
void setMaxInactiveInterval(int interval) //设置session允许的最大不活动时间(秒)
int getMaxInactiveInterval() //获取session可以的最大不活动时间(秒),默认为30分钟。当session在30分钟内没有使用,那么Tomcat会在session池中移除这个session;
long getCreationTime() //返回session的创建时间,返回值为当前时间的毫秒值;
long getLastAccessedTime() //返回session的最后活动时间,返回值为当前时间的毫秒值;
void invalidate() //让session失效,调用这个方法会让session失效,当session失效后,客户端再次请求,服务器会给客户端创建一个新的session,并在响应中给客户端新的sessionId;
boolean isNew() //查看session是否为新。当客户端第一次请求时,服务器为客户端创建session,但这时服务器还没有响应客户端,也就是还没有把sessionId响应给客户端,这时session的状态为新。
- 示例:获取设置session,并将其相关信息写到网页
public class SessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//统一编码,防止出现乱码问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//获取session
HttpSession session = req.getSession();
//设置session允许的最大不活动时间为60秒,即60秒内无操作,session自动注销
session.setMaxInactiveInterval(60);
//session创建时间
Date creationTime = new Date(session.getCreationTime());
//将session创建时间存入session
session.setAttribute("creationTime",creationTime);
if (session.isNew()) {
resp.getWriter().write("session创建成功,ID="+session.getId());
}else {
resp.getWriter().write("session已经在服务器中存在!<br>ID="+session.getId()+"<br>创建时间:"+session.getAttribute("creationTime"));
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 移除session中的属性,手动注销session
public class SessionDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
//移除session中的creationTime属性
session.removeAttribute("creationTime");
//手动注销Session
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
-
测试访问
- 第一次访问
- 第二次访问
- 手动注销session后,再次访问
- 60秒不活动后再次访问
- 第一次访问
4.2、在web.xml中配置session最大不活动时间
<session-config>
<!--15分钟后Session自动失效,以分钟为单位-->
<session-timeout>15</session-timeout>
</session-config>
5、Session与Cookie的区别
- Cookie是把用户的数据写给用户的浏览器,数据保存在客户端;Session技术把用户的数据写到用户独占的session中(服务器端),数据保存在服务器端;
- Cookie不是很安全,别人可以分析存在本地的Cookie,并进行Cookie欺骗,如果需要考虑安全,则使用Session;
- Session会在一定时间内保存在服务器上,当访问增多,会占用的服务器的性能,如果主要考虑减轻服务器性能,应当使用Cookie ;
- Cookie有大小和个数的限制。