思路:session中记录登录用户、购物车。再把sessionId加进cookie中。当程序判断是否登录时,会首先从session中取购物车对象,如果取不到,再通过cookie取出sessionId,再根据这个sessionId取出session。因而问题的关键在于如何保存session,当然最好的的方式是通过监听器来保存,代码如下:
package com.asm.base.listener;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class WebSessionListener implements HttpSessionListener {
private static Map<String, HttpSession> sessions = new LinkedHashMap<String, HttpSession>();
@Override
public void sessionCreated(HttpSessionEvent sessionEvent) {
System.out.println("创建" + sessionEvent.getSession().getId());
sessions.put(sessionEvent.getSession().getId(), sessionEvent.getSession());
}
@Override
public void sessionDestroyed(HttpSessionEvent sessionEvent) {
System.out.println("销毁" + sessionEvent.getSession().getId());
sessions.remove(sessionEvent.getSession().getId());
}
public static HttpSession getSession(String sessionId) {
return sessions.get(sessionId);
}
public static void remove(String sessionId) {
if (sessions.containsKey(sessionId)) {
sessions.remove(sessionId);
}
}
}
过滤器判断是否登录的代码如下:
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
Employee employee = (Employee) WebUtil.getlogonEmp(request); // 首先从当前session中获取
if (employee == null) {// 如果仍为空,然后再从cookie中获取
HttpSession session = WebSessionListener.getSession(WebUtil.getCookieByName(request,"sid"));
if (session != null) {
employee = (Employee) session.getAttribute("employee");
}
if (employee != null) {
request.getSession().setAttribute("employee", employee);
// 如果employee不为空,则把此对象加进当前session中
}
if (employee == null) {
request.setAttribute("message", "登录后便可进入管理页面");
request.getRequestDispatcher("logo.jsp").forward(request, response);
return;// 这里必须return 直接返回到登录页面
}
}
chain.doFilter(request, response);
}
登录时的关键代码:把登录对象加进session中,并把此session加进cookie中
request.getSession().setAttribute("employee", emp对象);
// 加进session
WebUtil.addCookie(response, "sid", request.getSession().getId(), request.getSession().getMaxInactiveInterval());
addCookie 方法的代码如下:
public static void addCookie(HttpServletResponse response, String name, String value, int maxAge) {
Cookie cookie = new Cookie(name, value);
cookie.setPath("/");
if (maxAge > 0)
cookie.setMaxAge(maxAge);
response.addCookie(cookie);
}