我想自己处理请求和会话属性,而不是将其留给spring @SessionAttributes,例如登录cookie处理.
我只是无法弄清楚如何HttpRequest在控制器中访问from,我需要一种方法去上面一层@RequestAttribute并访问它HttpRequest自己.使用Stripes来实现ApplicationContext和调用getAttribute().
此外,传递HttpServletRequestas参数似乎不起作用:
@RequestMapping(value="/") public String home(HttpServletRequest request){
System.out.println(""+request.getSession().getCreationTime());
return "home";
}
Run Code Online (Sandbox Code Playgroud)
上述方法不打印任何内容.
你对此有什么建议吗?
在JSF 2.0应用程序中使会话无效的最佳方法是什么?我知道JSF本身不会处理会话.到目前为止我能找到
private void reset() {
HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
.getExternalContext().getSession(false);
session.invalidate();
}
Run Code Online (Sandbox Code Playgroud)
@SessionScopedUserBean处理用户的登录注销.我在同一个bean中有这个方法.现在,当我reset()完成必要的数据库更新后调用该方法时,我当前的会话作用域bean会发生什么?既然豆本身也存放在HttpSession?假设我有一个运行的基于Java的Web应用程序,其中包含0个或更多HttpSession与之关联的有效对象.我想要一种方法来访问当前的有效HttpSession对象列表.我在想我可以实现一个HttpSessionListener并使用它来追加存储在应用程序范围的属性中的会话ID值列表,但随后会因会话失效而更新列表并且谁知道是什么其他.
在我开始烘焙自己的解决方案之前,我想我应该问一个问题:
servlet API是否提供了一些访问完整的非失效会话对象列表的方法?
我使用Tomcat 6.x作为我的Web应用程序容器和MyFaces 1.2.x(JSF)库.
解决方案
我遵循类似于BalusC在这些现有问题中讨论的方法:
我按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);
}
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
HttpSession session = event.getSession();
ApplicationData applicationData = getApplicationData();
Set<SessionData> activeSessions …Run Code Online (Sandbox Code Playgroud) 在Spring MVC(2.5)Web应用程序中存储用户的会话相关数据(例如,用户已执行的最近操作的日志)的最佳方法是什么?
使用经典的javax.servlet.http.HttpSession或在控制器bean中指定scope ="session",并将数据存储在会话对象中?
因此,当我请求此servlet时,我正在尝试使用servlet将Java对象添加到用户的会话中.但是在servlet重定向到下一页并尝试检索对象之后,我得到了一个null对象.
以下是我将对象添加到HttpSession(在servlet中)的操作:
request.setAttribute("object", obj);
Run Code Online (Sandbox Code Playgroud)
然后我尝试通过(在JSP中)检索它:
Object obj = request.getAttribute("object");
Run Code Online (Sandbox Code Playgroud)
那么我如何让obj不为null?
更新:我也没试过这个:
HttpSession session = request.getSession();
session.setAttribute("object", obj);
Run Code Online (Sandbox Code Playgroud)
在JSP中有以下内容:
Object obj = request.getSession().getAttribute("object");
Run Code Online (Sandbox Code Playgroud)
两种方式仍然返回null.
在ASP.NET站点中使用会话时,几乎在同一时间加载多个请求时会导致严重的延迟(500毫秒的倍数).
我们的网站专门为其SessionId使用会话.我们使用此密钥来查找具有用户信息等的db表.这似乎是一个很好的设计,因为它存储了最少的会话数据.不幸的是,如果你在会话中没有任何东西,SessionId会改变,所以我们存储Session["KeepId"] = 1;.这足以说服SessionId不要改变.
在一个看似无关的说明中,该网站通过控制器操作提供定制的产品图像.如果需要,此操作会生成图像,然后重定向到缓存的图像.这意味着一个网页可能包含图像或其他资源,通过ASP.NET管道发送数十个请求.
无论出于何种原因,当您(a)同时发送多个请求并且(b)以任何方式涉及会话时,您将最终获得大约1/2时间的随机500ms延迟.在某些情况下,这些延迟将是1000毫秒或更长,总是以~500毫秒的间隔增加.更多请求意味着更长的等待时间 对于某些图像,我们包含数十张图像的页面可能需要等待10秒以上.
创建一个空的控制器动作:
public class HomeController : Controller
{
public ActionResult Test()
{
return new EmptyResult();
}
}
Run Code Online (Sandbox Code Playgroud)创建一个test.html页面,其中包含一些符合该操作的img标记:
<img src="Home/Test?1" />
<img src="Home/Test?2" />
<img src="Home/Test?3" />
<img src="Home/Test?4" />
Run Code Online (Sandbox Code Playgroud)运行页面并观察firebug中的快速加载时间:

执行以下操作之一(两者都具有相同的结果):
向Global.asax.cs添加一个空的Session_Start处理程序
public void Session_Start() { }
Run Code Online (Sandbox Code Playgroud)把东西放在会议中
public class HomeController : Controller
{
public ActionResult Test()
{
HttpContext.Current.Session["Test"] = 1;
return new EmptyResult();
}
}
Run Code Online (Sandbox Code Playgroud)再次运行该页面并注意响应中的偶然/随机延迟.

如何检查会话是否无效?API中没有方法.
它是一样的isNew()吗?如果没有,有什么区别?
我有一个处理多部分表单帖子的servlet.帖子实际上是由嵌入页面的Flash文件上传组件制作的.在某些浏览器中,Flash生成的POST不包含JSESSIONID,这使得我无法在帖子期间从会话中加载某些信息.
Flash上传组件确实包含特殊表单字段中的cookie和会话信息.使用此表单字段,我实际上可以检索JSESSIONID值.问题是,我不知道如何使用此JSESSIONID值手动加载该特定会话.
编辑 -基于ChssPly76的解决方案,我创建了以下HttpSessionListener实现:
@Override
public void sessionCreated(final HttpSessionEvent se) {
final HttpSession session = se.getSession();
final ServletContext context = session.getServletContext();
context.setAttribute(session.getId(), session);
}
@Override
public void sessionDestroyed(final HttpSessionEvent se) {
final HttpSession session = se.getSession();
final ServletContext context = session.getServletContext();
context.removeAttribute(session.getId());
}
Run Code Online (Sandbox Code Playgroud)
这会将所有会话添加到ServletContext,作为由其唯一ID映射的属性.我可以在上下文中放置一个会话映射,但它似乎是多余的.请发表有关此决定的任何想法.接下来,我将以下方法添加到我的servlet以通过id解析会话:
private HttpSession getSession(final String sessionId) {
final ServletContext context = getServletContext();
final HttpSession session = (HttpSession) context.getAttribute(sessionId);
return session;
}
Run Code Online (Sandbox Code Playgroud) 由于对我们的一些产品进行了渗透测试,当时看起来很容易解决的"容易"问题变得非常棘手.
当然不应该这样,我的意思是,为什么只为当前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
' We use the default ID manager to generate a new session id
Dim idManager As New SessionIDManager() …Run Code Online (Sandbox Code Playgroud) 我需要ServletContext从内部获取@ServerEndpoint,以便找到Spring ApplicationContext并查找Bean.
目前我最好的方法是在JNDI命名上下文中绑定该bean并在其中查找它Endpoint.欢迎任何更好的解决方案.
我也在寻找一种合理的方法来将servlet HttpSession与websocket 同步Session.
httpsession ×10
java ×5
servlets ×4
session ×4
java-ee ×2
spring-mvc ×2
asp.net ×1
asp.net-mvc ×1
httprequest ×1
jsf-2 ×1
jsp ×1
managed-bean ×1
sessionid ×1
webforms ×1
websocket ×1