【问题标题】:Page generation time in servletservlet 中的页面生成时间
【发布时间】:2017-09-22 06:39:37
【问题描述】:

我有一个登录 servlet,它使用用户名和密码参数处理发布请求,并执行以下操作:

    Instant pageGenStart = Instant.now();

    String username = req.getParameter("username");
    String password = req.getParameter("password");

    resp.setContentType("text/html;charset=utf-8");

    User user = null;
    try {
        user = userService.getByUsername(username);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    if (user == null && !password.equals("")) {
        try {
            user = new User(username, password);
            user.setId(userService.addNewUser(username, password));

            charactersService.addNewCharacter(user);
            sessionsService.add(req.getSession().getId(), user.getId());
        } catch (SQLException e) {
            e.printStackTrace();
        }
        resp.setContentType("text/html;charset=utf-8");
        resp.setStatus(HttpServletResponse.SC_OK);
        Duration time = Duration.between(pageGenStart, Instant.now());

        resp.sendRedirect("/main");
    }

如果在数据库中找不到用户,则创建新用户并将他重定向到主页。通常我会把这个“时间”变量放到页面中,但我会将我的响应重定向到调用 doGet 方法的其他 servlet。我如何让其他 servlet 知道登录 servlet 需要多长时间来处理 post 请求?

【问题讨论】:

  • 将其添加到您的请求或会话中
  • @ScaryWombat 有什么方法可以包含它吗?还是我只是将其添加为字符串,例如 resp.sendRedirect("/main" + time.toMillis()) ?因为如果我这样做,它不会被包含为参数。
  • 你想用时间做什么?一般来说,如果您进行外部重定向,您要么需要将其存储在会话中,要么将其包含在重定向的请求参数中(但您必须接受它可以被用户操纵,除非您签名数据)
  • @ErwinBolwidt 一般来说,我只想在每个页面上显示页面生成时间
  • resp.sendRedirect("/main?generationTime=" + time.toMillis())

标签: java servlets


【解决方案1】:

您可以通过多种方式将值从一个 servlet 传递到另一个,例如:

  1. 在会话中存储值(您必须负责会话管理)
  2. 创建具有静态 ConcurrentHashMap 的类并存储每个用户会话的时间间隔并使用会话 ID 获取它。 (同样的问题需要注意什么时候清除缓存)。
  3. 使用已定义的 lib(最好的选择,因为您不必担心会话管理和缓存清除)。

我更喜欢 EH-cache 来处理这些问题,你可以从 Link 中看到一个很好的例子。

【讨论】:

  • 感谢您的建议! EH-cache 不是我在这个项目中寻找的东西,但我稍后会研究。
猜你喜欢
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多