`
86asm
  • 浏览: 203779 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

多个浏览器窗口共享购物车、登录用户

阅读更多

         思路: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);
 }

 

分享到:
评论
1 楼 cowboy_bebop 2010-11-28  
巴巴运动网,呵呵,楼主和我很类似,也是通过视频来学java的.基础/oracle/jsp,servlet/ssh,jpa/lucene.../项目

之前在onenote上做笔记,所有东西都记在上面.可是不久前把环境搬到linux上时,我的笔记都丢了.想想真纠结.还好在这里找到了你的笔记 :-)

相关推荐

    浏览器多窗口共用session引发的混乱

    然而,当用户在同一个浏览器的多个窗口或标签页中并行操作时,如果这些窗口都访问了同一个网站,浏览器可能会将所有窗口共享同一个Session ID。这意味着,窗口间的数据交互、操作状态可能会互相影响,导致数据混乱,...

    每个浏览器标签上的唯一会话ID

    这种做法在多标签浏览环境下尤其重要,因为用户可能在一个浏览器窗口内同时打开多个与同一网站的交互。 描述中的“在每个浏览器标签上管理会话的唯一页面ID”进一步强调了这个机制。它意味着每个浏览器标签内的页面...

    zengjs简化在不同标签或窗口之间进行通信

    在实际应用中,例如在一个多窗口协作的环境中,`zeng.js`可以用来同步用户的状态、共享数据或者控制多个窗口的协同工作。例如,一个编辑器窗口可以将用户的编辑状态实时同步到预览窗口,或者在一个购物车应用中,...

    前端项目-intercom.js.zip

    《前端项目:Intercom.js——...对于那些需要在多个浏览器窗口间进行深度交互的项目,Intercom.js无疑是一个值得考虑的解决方案。它的存在,进一步推动了前端开发技术的进步,为用户带来了更为智能、连贯的网页体验。

    【JavaScript源代码】详解JS浏览器储存.docx

    2. **生命周期**:Cookie可以设置过期时间,而LocalStorage和SessionStorage仅依赖于浏览器窗口或标签页的关闭。 3. **数据传输**:Cookie会随HTTP请求发送,增加网络负担;LocalStorage和SessionStorage则不会。 4....

    简易的浏览器选项卡间通信库

    在实际项目中,这种库可以帮助开发者实现例如购物车同步、用户登录状态共享、实时协作编辑等多种跨选项卡交互场景。由于其简洁的设计和易用的API,开发者可以快速集成到现有的项目中,提高开发效率。 文件名...

    session 作用域

    4. **session共享问题**:同一用户在多个浏览器窗口或设备上同时登录,可能会出现session共享的问题,需要合理设计以避免数据冲突。 文件"web_gt11_0505_session_shopcart"可能是一个更具体的购物车实现,涉及如何...

    js父窗口跟子窗口的互刷

    在JavaScript编程中,"父窗口跟子窗口的互刷"是指在浏览器环境中,一个窗口(父窗口)与打开的新窗口(子窗口)之间进行数据交换和状态更新的技术。这种技术通常用于实现弹出窗口间的通信,例如购物车详情或者多步骤...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Webview WebView(网络视图)能加载显示网页,可以将其视为一个浏览器。它使用了WebKit渲染引擎加载显示网页 Activity Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务,是一个负责与...

    PHP程序设计-3期(KC016) 3.12.1 session课后习题.doc

    - **cookie**:如果同一台机器上的多个浏览器窗口或标签页共享同一域名,cookie会被所有窗口共享。 理解session和cookie的这些差异对于有效地实现用户身份验证、购物车功能、个性化设置等Web应用程序功能至关重要...

    application与session的区别

    由于HTTP协议本身是无状态的(即服务器无法记住客户端之间请求的状态信息),因此需要一种方法来保存用户的特定信息以便在多个页面请求间共享。Session就是为了解决这一问题而设计的。 当用户首次访问网站时,...

    sessionStroage 的有效期

    只要浏览器窗口保持打开状态,或者用户在同一个浏览器标签页中导航,SessionStorage 中的数据就会一直存在。一旦用户关闭了浏览器窗口或标签页,与之相关的 SessionStorage 数据将被清除,即使用户重新加载页面或...

    北大青鸟JSP内部资料

    - **原因**:这是由于浏览器会为每个窗口分配不同的session ID,因此即使在同一时间内打开多个窗口,它们之间的session也不会共享。 - **解决方法**:可以通过特定配置或者编程手段来实现在不同窗口间共享session...

    Application,Session,Cookies对象应用介绍

    每个浏览器窗口都有其独立的Session对象,这意味着用户在不同窗口中的操作不会互相影响,确保了数据的安全性和私密性。Session对象常用于用户身份验证,例如在用户登录时,我们可以将用户名存储在Session中,然后在...

    前端开源库-localsync

    总的来说,`localsync`是一个对于前端开发者来说非常有价值的工具,它解决了多窗口、多标签页应用中的数据同步问题,提高了应用的响应速度和用户体验。在`localsync-master`压缩包中,包含了项目源码、示例和文档,...

    1cli​​ckBOM:一种浏览器扩展程序,用于快速在购物车中填充电子零件

    概要一键式BOM是一种浏览器扩展程序,可在Digikey和Mouser等网站上为您填充购物车。 它的主要目的是与电子项目共享站点。 但是,您也可以从电子表格中使用它,也可以从任何其他站点加载在线.tsv文件。目录新闻 哪个...

    静态页面间传值实例静态页面间传值实例

    7. **自定义事件和消息传递**:利用`MutationObserver`或`BroadcastChannel` API,可以在同一个浏览器窗口的不同页面间创建通信通道,实现页面间的实时数据传递。 8. **文件存储**:在用户许可的情况下,可以将数据...

    html5 api实验.docx

    - `sessionStorage`:数据只在当前会话(浏览器窗口)中有效,关闭窗口后数据会被清除。这适合临时存储页面间需要共享但不跨会话的数据,如购物车中的商品。 使用这两个API的基本方法包括`setItem`(设置键值对)...

    ASP程序设计

    2.3 框架结构:HTML的框架(frames)功能允许在一个浏览器窗口中显示多个独立的网页。和标签用于定义和填充这些框架。 在【第三章 ASP内置对象】中,介绍了ASP编程的核心组件: 3.1 Request对象:Request对象用于...

    Session详解

    在某些场景下,可能需要在多个Web应用之间共享Session数据,如单点登录(SSO)系统。实现跨应用的Session共享通常涉及以下几种策略: 1. **集中式Session存储**:所有应用都指向同一个Session存储,如数据库或...

Global site tag (gtag.js) - Google Analytics