会话技术

本文详细介绍了会话技术,包括Cookie和Session的用途、工作原理、常用方法以及实战案例。Cookie是客户端技术,用于存储小量数据,而Session是服务器端技术,用于跟踪用户会话。文章探讨了如何设置Cookie的存活时间,以及在不同场景下使用Cookie和Session的策略。此外,还讲解了如何在关闭浏览器后重新获取Session。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.会话技术

2.Cookie

3.Session

 

一、会话技术

1.会话技术简介

         会话:用户打开浏览器,浏览页面,直到关闭浏览器的过程称为一次会话。

        为什么要学习会话技术?

       http协议是一个无状态协议,服务器端无法记录客户端浏览器身份信息。

       例如:购物网站,购物车(需要记录用户购买商品的信息)。

                如何做到?  request? 无法实现,会发现结账时,没有任何商品信息。

                                     ServletContext? 无法实现,结账时会发现,所有人的商品信息都在购物车中。

         因此,需要使用会话跟踪技术解决。

        会话跟踪技术包括: Cookie(客户端技术)、Session(服务器端技术)

二、Cookie

1.Cookie简介

      生活中常见的使用Cookie的案例:QQ记住密码、网站智能账号密码填充、百度搜索记录

     作用:将数据存储到本地为了智能填充数据,还能够增强用户体验,缓解服务器压力。

     (1)Cookie在哪

      

       删除所有的本地Cookie 方法:Ctrl + shift + Delete

       

      (2)如何给自己的网站缓存数据

       response 是可以将信息返回到浏览器上,所以设置Cookie 的时候是借助Response对象将Cookie发送到本地浏览器。

       获取Cookie的方法时通过reqeust 进行获取

package com.xj.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 CookieDemo1Servlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request,response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.创建Cookie----参数name和value都是String,而且不能用非西文
		Cookie cookie = new Cookie("company","QQCY");
		//2.通过response将Cookie传给客户端
		response.addCookie(cookie);
	}

}

   :如果再创建一个Cookie,name一样,那么会覆盖原来的值。

package com.xj.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 CookieDemo2Servlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//获取客户端带来的Cookie
		//request.getCookies()获取所有Cookie
		//不支持按个获取,request方法会直接将所有的cookie全部取到并返回一个数组
		Cookie[] cs = request.getCookies();
		for(Cookie c:cs){
			//Cookie没哟提供根据name获取value的方法,提供了两个方法
			System.out.println(c.getName()+":"+c.getValue());
		}
		
	}
}

2.Cookie的常用方法

       构造方法: Cookie c = new Cookie("",""); 创建Cookie时, name和value都是字符串。注意:不能用中文字符串。

      getName() 获得Cookie的name

      getValue() 获得Cookie的value 注意:Cookie没有提供根据name获取value的方法

      setMaxAge(int 秒) 设置Cookie的存活时间

      setPath() 设置Cookie的有效路径

      浏览器将cookie保存硬盘的路径,是各个浏览器自己制定,其他无法进行操作的。

      有效路径:浏览器发送请求时,cookie的代入路径。

      请求路径 等于或者包含cookie的有效路径,该cookie会在请求时被代入。

      请求路径是从资源位置开始进行判断

方法名

描述

setPath(java.lang.String uri)

设置有效路径。

设置cookie允许被访问的路径。设置的路径,以及子路径都被允许访问。

例如:setPath("/web/a/b");

http://localhost:8080/web/a/b/oneServlet,可访问(当前路径)

http://localhost:8080/web/a/b/c/oneServlet,可访问(子路径)

http://localhost:8080/web/a/c/oneServlet,不允许访问(无关路径)

常见设置:setPath("/") ,当前tomcat下的所有的web项目都可以访问

cookie.setPath("/");

3.封装查找Cookie的工具类

package com.xj.utils;

import javax.servlet.http.Cookie;

public class CookieUtils {
	
	public static Cookie findCookieByName(Cookie[] cs,String name){
		if(cs!=null){
			for(Cookie c:cs){
				if(name.equals(c.getName())){
					return c;
				}
			}
		}
		return null;
	}
}
package com.xj.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;

import com.xj.utils.CookieUtils;

public class CookieDemo2Servlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		Cookie[] cs = request.getCookies();
		Cookie c = CookieUtils.findCookieByName(cs, "company");
		if(c!=null){
			System.out.println(c.getName()+":"+c.getValue());
		}
		
	}
}

4.设置Cookie的存活时间

        上面的代码创建的Cookie,如果关闭浏览器,再访问CookieDemo2Servlet,控制台不会获取到Cookie,说明上面创建的Cookie是瞬时的。下面的代码设置Cookie的存活时间,即使关闭了浏览器,再访问CookieDemo2Servlet时,还是会获取到。

package com.xj.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 CookieDemo1Servlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request,response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//创建Cookie
		Cookie c = new Cookie("address","CHINA");
		//设置存活时间,设置完成后,这个Cookie就编程持久化Cookie,保存在浏览器管理的一个磁盘文件中(保存时间为设置的时间)
		c.setMaxAge(7*24*60*60);//设置7天
		//把Cookie响应给客户端
		response.addCookie(c);
	}

}

5.案例

    (1) 利用Cookie记录客户端是否是第一次访问

    需求:创建一个FirstCookieServlet 客户端访问这个Servlet

              如果是第一次访问这个Servlet 显示 欢迎第一次访问

              如果不是第一次访问这个Servlet 显示 欢迎回来

package com.xj.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.xj.utils.CookieUtils;


public class FirstCookieServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		Cookie[] cs = request.getCookies();
		Cookie c = CookieUtils.findCookieByName(cs, "visited");
		
		if(c==null){
			out.print("<h1>欢迎第一次访问</h1");
			
			Cookie cookie = new Cookie("visited","true");
			cookie.setMaxAge(10000);
			response.addCookie(cookie);
			
		}else{
			out.print("<h1>欢迎回来</h1");
		}
	}

}

    (2)利用Cookie记录客户端上次访问时间

      1.接收客户端带过来Cookie的信息

      2.从数组中查找指定名称Cookie,如果找不到(第一次访问),输出一个欢迎 ,如果找到了(不是第一次),取出上次的访问时间,显示到页面

      3.记录系统当前时间

     4.利用Cookie回写当前时间

package com.xj.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.xj.utils.CookieUtils;


public class SecondCookieServlet extends HttpServlet {

	private static final String SimpleFormate  = null;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		Cookie[] cs = request.getCookies();
		Cookie c = CookieUtils.findCookieByName(cs, "lastVisitedTime");
		
		if(c==null){
			out.print("<h1>欢迎第一次访问</h1>");
		}else{
			String value = 	c.getValue();
			out.print("<h1>"+value+"</h1>");
		}
		
		Date date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd#HH:mm:ss");
		String str = sdf.format(date);
		Cookie cookie = new Cookie("lastVisitedTime",str);
		cookie.setMaxAge(100000);
		response.addCookie(cookie);
		
	}

}

    (3)记录用户名

      1、数据库

      2、导包

      3、工具类和配置文件(配置文件里面要改成新建的数据库)

      4、页面

<%@page import="com.xj.utils.CookieUtils"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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>Insert title here</title>
</head>

	<%
		Cookie[] cs = request.getCookies();
		Cookie c = CookieUtils.findCookieByName(cs,"username");
		
		String username="";
		if(c!=null){  
			username = c.getValue();
		}
	%>

	<div style="color:red">
		<c:if test="${param.msg=='loginerror' }">
			用户名或密码错误
		</c:if>
	</div>

<body>
	<form action="${pageContext.request.contextPath }/LoginServlet">
		用户名:<input type="text" name="username" value="<%=username %>"/><br>
		密码:<input type="password" name="password" /><br>
		记录用户名:<select name="record">
					<option value="0">记录0天</option>
					<option value="7">记录七天</option>
					<option value="30">记录30天</option>
				</select><br>
				<input type="submit" value="登录" />
	</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>Insert title here</title>
</head>
<body>
	<h1>主页,欢迎 </h1>
</body>
</html>

      5、实体类

package com.xj.bean;

public class User {
	private int id;
	private String name;
	private String username;
	
	public User(){}
	public User(int id, String name, String username) {
		super();
		this.id = id;
		this.name = name;
		this.username = username;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	
	
}

     6、dao

package com.xj.dao;

import com.xj.bean.User;

public interface UserDao {
	public User login(String username,String password);
}
package com.xj.dao.impl;

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;

import com.xj.bean.User;
import com.xj.dao.UserDao;
import com.xj.utils.C3p0Utils;

public class UserDaoImpl implements UserDao{

	@Override
	public User login(String username, String password) {
	
		User user = null;
		QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());
		String sql = "select * from user where username=? and password=?";
		
		try {
			user = qr.query(sql, new BeanHandler<>(User.class),username,password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return user;
	}

}

      7、Servlet

package com.xj.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;

import com.xj.bean.User;
import com.xj.dao.UserDao;
import com.xj.dao.impl.UserDaoImpl;


public class LoginServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		 
		request.setCharacterEncoding("utf-8");
		
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String record = request.getParameter("record");
		
		UserDao dao = new UserDaoImpl();
		User user = dao.login(username, password);
		
		if(user!=null){
			
			int num = Integer.parseInt(record);
			if(num!=0){
				
				Cookie c = new Cookie("username",username);
				c.setMaxAge(num*24*60*60);
				response.addCookie(c);
			}
			response.sendRedirect("index.jsp");
		}else{
			response.sendRedirect("login.jsp?msg=loginerror");
		}
	}

}

      8、结果

    (4)记录浏览记录并且清除浏览记录

     工具类参考前面

     1、main.jsp

<%@page import="com.xj.utils.CookieUtils"%>
<%@ 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>Insert title here</title>
</head>
<body>
	<table>
		<tr>
			<td><img src="img/1.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=1">萝卜</a></div></td>
			<td><img src="img/2.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=2">冬瓜</a></div></td>
			<td><img src="img/3.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=3">西红柿</a></div></td>
		</tr>
		<tr>
			<td><img src="img/4.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=4">芹菜</a></div></td>
			<td><img src="img/5.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=5">土豆</a></div></td>
			<td><img src="img/6.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=6">胡萝卜</a></div></td>
		</tr>
	</table>
	<hr>
	<div>
		浏览记录:<a href="ClearServlet">清除浏览记录</a>
	</div>
	<%
		Cookie[] cs = request.getCookies();
		Cookie c = CookieUtils.findCookieByName(cs, "ids");
		
		if(c!=null){
			String value = c.getValue();
			String[] ss = value.split(",");
			for(String s:ss){
				
	%>  
	<img src="img/<%=s %>.jpg" width="150px" height="100px">
	<% 	
			}
		}
	%>
</body>
</html>

     2、view.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>Insert title here</title>
</head>
<body>
	<img src="img/${requestScope.id }.jpg" width="400px" height="400px" />
	<div>产地...</div>
	<div>价格...</div>
	<div>数量...</div>
	<div><a href="main.jsp">返回</a></div>
</body>
</html>

      3、FindGoodsServlet

package com.xj.servlet;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.mysql.fabric.xmlrpc.base.Array;
import com.xj.utils.CookieUtils;


public class FindGoodsServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		String id = request.getParameter("id");
		//如果是真实的项目,应该根据id到数据库中查询书数据,跳转到展示页面
		//这里就不真实查询数据库了,就用id值充当商品
		
		//记录浏览过哪些商品,使用Cookie
		Cookie[] cs = request.getCookies();
		Cookie c = CookieUtils.findCookieByName(cs, "ids");
		
		if(c==null){//说明是第一次浏览商品
			Cookie cookie = new Cookie("ids",id);
			cookie.setMaxAge(10000);
			response.addCookie(cookie);
		}else{//浏览过商品
			//判断是否浏览过本商品
			String value = c.getValue();
			String[] ss = value.split(",");		
			List<String> list = Arrays.asList(ss);
			
			if(!list.contains(id)){
				value=value+","+id;
				Cookie cookie = new Cookie("ids",value);
				cookie.setMaxAge(10000);
				response.addCookie(cookie);
			}
		}
			
		 request.setAttribute("id", id);
		 request.getRequestDispatcher("view.jsp").forward(request, response);
		
	}

}

     4、ClearServlet

package com.xj.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;

import com.xj.utils.CookieUtils;


public class ClearServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/*//第一种解决方案  覆盖
		Cookie c = new Cookie("ids","");
		response.addCookie(c);*/
		
		//第二种解决方式
		Cookie[] cs = request.getCookies();
		Cookie c = CookieUtils.findCookieByName(cs, "ids");
		
		c.setMaxAge(0);
		response.addCookie(c);
		response.sendRedirect("main.jsp");
	}

}

     5、结果

三、Session

1.简介

      服务端会话技术

      Servlet规范下的一个组件,全称HttpSession,同时也是一个作用域。

      生活中实例:登录网站,关闭浏览器之后会提示你重新登录。

      如何做到关闭浏览器后通知你重新登录。

     Session作用域的特性:存放的值可以跨页面,只要你不关闭浏览器那么你的作用域的值就一直存在。也就意味着会话不结束session长存(可以设置最大存活时间)。

     实际项目中如何实现访问页面拦截:在登录成功之后,将用户的ID或者对象存到Session中,如果访问页面的时候判断Session中存在这个ID 意味着现在已经登录可以访问本页面,如果ID获取不到,意味着没有登录。

2.获取Session

       方式一:  HttpSession session = request.getSession()

        如果session还没有创建,则创建。

        如果已经创建,则使用已经创建的session。

        方式二:  HttpSession session = request.getSession(false);

        如果session已经创建过,则使用已经创建的session。

        如果session没有创建过,则返回null。

        Session的getId() 方法可以获得Session的id

package com.xj.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class SessionDemo1Servlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//1.获取HttpSession对象 getSession()
		HttpSession session = request.getSession();
		System.out.println(session.getId());
		
	}

}

package com.xj.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


public class SessionDemo2Servlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		HttpSession session = request.getSession();
		System.out.println(session.getId());
	}

}

package com.xj.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class SessionDemo3Servlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		HttpSession session = request.getSession(false);
		System.out.println(session.getId());
	}
}

3、Session常用方法

        session.setAttribute("",Object);

        session.getAttribute("");

        session.removeAttribute("");

        可以作为作用域  

package com.xj.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class SessionDemo4Servlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		request.setAttribute("reqkey", "reqvalue###");
		request.getSession().setAttribute("sessionkey", "sessionvalue");
		this.getServletContext().setAttribute("sckey", "scvalue<<>>");
		
		response.sendRedirect("SessionDemo5Servlet");
	}

}
package com.xj.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SessionDemo5Servlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		String reqvalue = (String)request.getAttribute("reqkey");
		String sessionvalue = (String)request.getAttribute("sessionkey");
		String scvalue = (String)this.getServletContext().getAttribute("sckey");
		
		System.out.println("request:"+reqvalue);
		System.out.println("session:"+sessionvalue);
		System.out.println("sc:"+scvalue);
		
	}

}

4.Session的原理

      当创建完session后,服务器会做一个Cookie(瞬时Cookie),把session的id值带给用户

5.Session的创建和销毁

     (1) Session的创建

      在某个会话下,第一次调用getSession()为本次会话创建Session

     (2) Session的销毁

     注:浏览器关闭Session对象并没有销毁(指向Session的保存着Session的id的Cookie就不存在了,也就再也不能访问到之前的Session对象了。Session对象变成了垃圾)  只不过是存放这个Session的id的Cookie销毁了,导致Session对象获得不到了。

    1、关闭服务器(非正常关闭服务器)

    (如果是正常关闭服务器,Session将被序列化到服务器中)tomcat\work\Catalina\localhost\1202Session\SESSION.ser

    2、session时间到期 session的默认存活时间是30分钟

     默认配置在tomcat的web.xml中

     <session-config>

                   <session-timeout>30</session-timeout>

     </session-config>

     可以在自己的web.xml配置Session的过去时间,配置方式和tomcat的web.xml中配置方式相同。

     3、调用session 的  invalidate()方法

     还能够获得到session的id值,但session的其他方法就不能调用了

    

5.案例:session中保存登录信息

     在cookie的后两个案例基础上进行修改

    1、LoginServlet 

package com.xj.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;
import javax.servlet.http.HttpSession;

import com.xj.bean.User;
import com.xj.dao.UserDao;
import com.xj.dao.impl.UserDaoImpl;


public class LoginServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		 
		request.setCharacterEncoding("utf-8");
		
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String record = request.getParameter("record");
		
		UserDao dao = new UserDaoImpl();
		User user = dao.login(username, password);
		
		if(user!=null){
			
			HttpSession session = request.getSession();
			session.setAttribute("user", user);
			
			int num = Integer.parseInt(record);
			if(num!=0){
				
				Cookie c = new Cookie("username",username);
				c.setMaxAge(num*24*60*60);
				response.addCookie(c);
			}
			response.sendRedirect("index.jsp");
		}else{
			response.sendRedirect("login.jsp?msg=loginerror");
		}
	}

}

      2、index.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>Insert title here</title>
</head>
<body>
	<h1>主页,欢迎 ,${sessionScope.user.username }</h1>
</body>
</html>

      3、main.jsp

<%@page import="com.xj.utils.CookieUtils"%>
<%@page import="com.xj.bean.User"%>
<%@ 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>Insert title here</title>
</head>
<body>

	<%
		User user  = (User)session.getAttribute("user");
		if(user==null){
			response.sendRedirect("login.jsp?msg=pleaselogin");
		}
	%>


	<table>
		<tr>
			<td><img src="img/1.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=1">萝卜</a></div></td>
			<td><img src="img/2.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=2">冬瓜</a></div></td>
			<td><img src="img/3.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=3">西红柿</a></div></td>
		</tr>
		<tr>
			<td><img src="img/4.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=4">芹菜</a></div></td>
			<td><img src="img/5.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=5">土豆</a></div></td>
			<td><img src="img/6.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=6">胡萝卜</a></div></td>
		</tr>
	</table>
	<hr>
	<div>
		浏览记录:<a href="ClearServlet">清除浏览记录</a>
	</div>
	<%
		Cookie[] cs = request.getCookies();
		Cookie c = CookieUtils.findCookieByName(cs, "ids");
		
		if(c!=null){
			String value = c.getValue();
			String[] ss = value.split(",");
			for(String s:ss){
				
	%>  
	<img src="img/<%=s %>.jpg" width="150px" height="100px">
	<% 	
			}
		}
	%>
</body>
</html>

    4、login.jsp

<%@page import="com.xj.utils.CookieUtils"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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>Insert title here</title>
</head>

	<%
		Cookie[] cs = request.getCookies();
		Cookie c = CookieUtils.findCookieByName(cs,"username");
		
		String username="";
		if(c!=null){  
			username = c.getValue();
		}
	%>

	<div style="color:red">
		<c:if test="${param.msg=='loginerror' }">
			用户名或密码错误
		</c:if>
		<c:if test="${param.msg=='pleaselogin' }">
			请登录
		</c:if>
	</div>

<body>
	<form action="${pageContext.request.contextPath }/LoginServlet">
		用户名:<input type="text" name="username" value="<%=username %>"/><br>
		密码:<input type="password" name="password" /><br>
		记录用户名:<select name="record">
					<option value="0">记录0天</option>
					<option value="7">记录七天</option>
					<option value="30">记录30天</option>
				</select><br>
				<input type="submit" value="登录" />
	</form>
</body>
</html>

     5、结果

6.禁用Cookie如果使用Session

      

     禁用Cookie,使用上面的案例,访问main.jsp,提示登录,登录之后,再次访问main.jsp,商品页面没有显示出来,仍是登录页面。

package com.xj.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class SessionDemo6Servlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		HttpSession session = request.getSession();
		System.out.println(session.getId()+"----");
		
		session.setAttribute("username", "青青草原");
		//response.sendRedirect("SessionDemo7Servlet");两次获取的session不一样,且servlet6存的值servlet7取不到
		response.sendRedirect("SessionDemo7Servlet;jsessionid="+session.getId());//两次获取的session一样,且servlet6存的值servlet7取得到
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
package com.xj.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class SessionDemo7Servlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		HttpSession session = request.getSession();
		System.out.println(session.getId()+"<<<>>>");
		System.out.println(session.getAttribute("username"));
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

7.关闭浏览器重新打开怎么获取原来的session

      由前面可知,如果关闭浏览器再访问,会获得不一样的session值,下面代码可以做到关闭浏览器使得两次获得的session值一样。

   因为上面禁止了,所以在这要设置允许。

package com.xj.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;
import javax.servlet.http.HttpSession;


public class SessionDemo8Servlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		
		Cookie c = new Cookie("JSESSIONID",session.getId());//注意要大写
		c.setMaxAge(10000);
		response.addCookie(c);
		
		System.out.println(session.getId());
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		doGet(request, response);
	}

}

8.Cookie和Session的区别与联系

      1、数据存储的位置不同 Cookie在客户端 Session在服务器端

      2、生命周期不同 。Cookie(会话(瞬时)Cookie浏览器关闭   持久化Cookie setMaxAge(秒数))Session(默认30分钟,可以修改)

      3、cookie只能存放字符串名值对(都是字符串),session可以是任意对象

      4、同一个浏览器接受cookie的个数是有上限,session理论上是无限的。

     联系:session的状态是靠cookie来保持的,session的id会通过cookie带给客户端

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值