【问题标题】:Multiple extremely short lived session attributes in an application应用程序中的多个极短寿命会话属性
【发布时间】:2016-01-20 09:34:17
【问题描述】:

我有一个显示数据库中所有记录的 jsp 页面。每列下方都有一个删除按钮。删除记录的servlet的代码是。

new userDao().get(User.Class,Long.parseLong("id")).delete();
// for some reasons I cannot use requestDispatcher, so I store the delete successful message in a session
request.getSession().setAttribute("message","Delete successful.");
// view.html is a servlet that gets all records
response.sendRedirect("view.html");

在view.html servlet中

request.setAttribute("message",get the message attribute from HTTPSession);
request.getSession().removeAttribute("message");
// go back to jsp
request.getRequestDispatcher("view.jsp").forward(request,response);

我的很多页面都是这样的。我知道会话用于跨越多个请求的数据,但我在做什么是好的还是坏的做法?我做错了吗?

【问题讨论】:

  • response.sendRedirect("view.html?message=" + URLEncoder.encodeURL("D...", "UTF-8")); 也许?使用 view.jsp (session=false, ${para.message}) 或 JavaScript
  • @JoopEggen 如果你使用这种方法,要非常小心代码注入攻击。
  • Frameworks 将这些“flash 属性”称为“flash 属性”,并尽量避免它们导致的多选项卡并发问题:docs.spring.io/spring/docs/current/spring-framework-reference/…
  • @JiriTousek 删除活动已经发生,查看只是结果。但是,是的,第一行代码也困扰了我。
  • @JoopEggen 这不是我的意思——我的意思是如果你从 URL 参数中获取一条消息并显示它,你需要转义它,这样没有人可以使用它来将他们的代码插入你的以这种方式页面(又名 XSS)。

标签: java session jakarta-ee servlets


【解决方案1】:

这也是框架的做法。基本上没有多少其他地方可用于跨页面重定向存储这些消息。所以大多数框架只是使用某种状态(视图状态、流状态或框架调用的任何状态),然后将整个对象存储在会话中。

也不是说你不是 ,根据你的例子,使用任何 短期 会话 - 很可能你正在使用一个长期session,只有它的内容是短暂的。最后,您在会话中设置的内容不会传播到客户端(客户端仅保存会话 ID),并且通常它可能会保存在内存中,因此会话数据的频繁更改应该不是问题。

【讨论】:

    猜你喜欢
    • 2012-10-11
    • 2011-11-12
    • 2017-01-11
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2019-10-25
    相关资源
    最近更新 更多