很多人在最初使用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存于数据库,能否可行。
如有不妥之处,望指正。