在Spring MVC(2.5)Web应用程序中,存储用户会话相关数据的最佳方式是什么(例如用户最近执行的操作的日志)? 使用经典的javax.servlet.http.HttpSession或者通过在控制器bean中指定scope =“session”,并将数据存储在会话对象中?
比方说,我有一个正在运行的基于Java的Web应用程序,其中有0个或更多有效的HttpSession对象与之关联。 我想要一种方法来访问当前有效的HttpSession对象列表。 我在想,我可以实现一个HttpSessionListener并使用它来追加到存储在应用程序作用域属性中的会话id值列表中,但是随着会话无效,还有什么。 在我开始烘焙自己的解决scheme之前,我想我应该问这个问题: servlet API是否提供了一些访问非失效会话对象的完整列表的方法? 我使用Tomcat 6.x作为我的Web应用程序容器,以及MyFaces 1.2.x(JSF)库。 解 我采用了类似于BalusC在这些现有问题中讨论的方法: 如何在Grails或Java应用程序中轻松实现“谁在线”? JSF:如何使用相同凭据login两次时使用户会话失效 我由SessionData类修改来实现HttpSessionBindingListener 。 绑定事件发生时,对象将添加或从所有SessionData对象的集合中删除它自己。 @Override public void valueBound(HttpSessionBindingEvent event) { // Get my custom application-scoped attribute ApplicationData applicationData = getApplicationData(); // Get the set of all SessionData objects and add myself to it Set<SessionData> activeSessions = applicationData.getActiveSessions(); if (!activeSessions.contains(this)) { activeSessions.add(this); } } […]
在JSF 2.0应用程序中使会话无效的最佳方式是什么? 我知道JSF本身不处理会话。 到目前为止,我可以find private void reset() { HttpSession session = (HttpSession) FacesContext.getCurrentInstance() .getExternalContext().getSession(false); session.invalidate(); } 这个方法是否正确? 有没有触摸ServletAPI的方法? 考虑一个@SessionScoped UserBean处理用户login注销的场景。 我在同一个bean中有这个方法。 现在当我完成必要的数据库更新之后调用reset()方法时,我的当前会话scoped bean会发生什么? 因为即使这个bean本身存储在HttpSession ?
由于对我们的一些产品进行渗透testing,当时看起来是一个“简单”的问题需要解决的事情变得艰难。 当然不是,当然,我的意思是为什么要为当前的HTTPContext生成全新的会话非常困难? 离奇! 无论如何,我已经写了一个厚脸皮的小实用程序课,“只是做”: (道歉代码格式化/突出显示/ Visual Basic我必须做错了什么) Imports System.Web Imports System.Web.SessionState Public Class SwitchSession Public Shared Sub SetNewSession(ByVal context As HttpContext) ' This value will hold the ID managers action to creating a response cookie Dim cookieAdded As Boolean ' We use the current session state as a template Dim state As HttpSessionState = context.Session […]
我想自己处理请求和会话属性,而不是把它留给Spring @SessionAttributes ,例如用于logincookie处理。 我只是无法弄清楚如何从控制器内部访问HttpRequest ,我需要一种方法去@RequestAttribute上方的一层,并访问HttpRequest本身。 在Stripes中通过实现一个ApplicationContext并调用getAttribute()来完成此操作。 此外,传递HttpServletRequest参数似乎不工作: @RequestMapping(value="/") public String home(HttpServletRequest request){ System.out.println(""+request.getSession().getCreationTime()); return "home"; } 上面的方法不打印任何东西。 你有什么build议吗?