使用session时如何让浏览器关闭后,在下次打开浏览器时session不“消失”(以购物车存于session为例)

很多人在最初使用session存信息的时候会发现,当浏览器关闭后,下次打开时存的session已经不见了。


众所周知,session是存于服务器端中,那么为什么关闭浏览器后,再次打开,session会不见呢。

首先,session有一个唯一的标识符,即session的id,JSESSIONID(sessionid)。
当用户每次发出请求session中的信息时,Servlet会根据这个id找到相应的session,然后获取这个session中的信息。

而这个id,是存于cookie中的。cookie中的存储方式又分两种,一种存于本地硬盘上,一种存于浏览器进程中。
session的id,就是存于第二种——浏览器进程中。

所以当我们关闭浏览器后,这个id没了,下次打开浏览器,请求存了信息的session时,自然就找不到了。这个找不到的session会一直存于服务器端中,直到它的存放时间到了后才会自动销毁。

问题的原因已经知道了,接下来便是解决了


手动将此id存于本地cookie中便可以解决了。

以下以seesion存购物车为例展开代码

存入session

package market;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

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

import JDBCcon.JDBC;

/**
 * Servlet implementation class buycar
 */
@WebServlet("/buycar")
public class buycar extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public buycar() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		String user = request.getParameter("user");
		String bookname = request.getParameter("bookname");
		String price = request.getParameter("price");
		String all = bookname+" "+price;
		@SuppressWarnings("unchecked")
		List<String> list = (List<String>)request.getSession().getAttribute(user);
		if(list==null) //判断此user有无购物车,没有就创建一个购物车给他
		{
			list = new ArrayList<String>();
			list.add(all);
			out.println("创建购物车成功<br>");
		}
		else { //添加商品
			list.add(all);
			out.println("添加成功");
		}
		//将JSESSIONID存于本地cookie中
		Cookie cookiesessionid = new Cookie("JSESSIONID",request.getSession().getId()); 
		cookiesessionid.setMaxAge(30*24*60*60);
		response.addCookie(cookiesessionid);
		//存Session
		request.getSession().setAttribute(user, list);
		//2秒后跳转
		response.setHeader("refresh", "2;URL='/........'");
		
	}

}

取session

List<String> list = (List<String>)request.getSession().getAttribute(user);
double jiage = 0;
for(String word:list)
{
	String newword[] = word.split(" ");
	String bookname = newword[0];
	String priceString = newword[1];
	double price = Double.parseDouble(priceString);
	jiage = jiage + price;
	out.prnintln(bookname+"¥"+price+"<br>");
}
out.println("总计:¥"+jiage);

这种方式仅限同一个浏览器,因为不同浏览器cookie也不同,而session的id便是存于cookie中。

如果想突破此限,不知将sessionid存于数据库,能否可行。

如有不妥之处,望指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值