【问题标题】:Set session cookie listener设置会话 cookie 监听器
【发布时间】:2015-12-09 21:22:17
【问题描述】:

我怎样才能在我的网站上显示一个 cookie 被加载了多少次? 例如,我使用我的凭据登录,我的 jsp 运行并显示结果...当我得到结果时,我想说这样的用户名凭据:

 <% 
      String Usuario = null;
      Cookie[] cookies =request.getCookies();
      if (cookies != null){
          for(Cookie cookie : cookies){
              if(cookie.getName().equals("usuario"))
                  Usuario = cookie.getValue();

          }
      }
  if (Usuario == null)
      response.sendRedirect("Index.html");
  %>
  <h3>
      Hi <%=Usuario %>, Login Complete.
  </h3>

  <form action="Logout" method="post">
      <input type="submit" value="Logout">
  </form>

但是如果我重新加载页面,我想计算重新加载 cookie 的次数,所以在我的回复中我得到:

      <h3>
          Hi <%=Usuario %>, Login Complete. + cookiecount
      </h3>

我该怎么做?

JSP:

<!DOCTYPE html>
 <html>
     <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Login con Cookies</title>
</head>
<body>
  <% 
      String Usuario = null;
      Cookie[] cookies =request.getCookies();
      if (cookies != null){
          for(Cookie cookie : cookies){
              if(cookie.getName().equals("usuario"))
                  Usuario = cookie.getValue();

          }
      }
  if (Usuario == null)
      response.sendRedirect("Index.html");
  %>
  <h3>
      Hi <%=Usuario %>, Login Complete.
  </h3>

  <form action="Logout" method="post">
      <input type="submit" value="Logout">
  </form>
</body>

LoginServlet:

 @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    String user = request.getParameter("usuario");
    String contra = request.getParameter("contrasena");

    if (userID.equals(user) && password.equals(contra)){
        Cookie Gerardocookie = new Cookie("usuario",user);
        Gerardocookie.setMaxAge(60 * 60);
        response.addCookie(Gerardocookie);
        response.sendRedirect("Procesardatos.jsp");
    } else{
        RequestDispatcher rd = getServletContext().getRequestDispatcher("/index.html");
        PrintWriter out = response.getWriter();
        out.println("<font color=red>Usuario y/o contrasena invalidas");
        rd.include(request, response);
    }
}

--------------------------------更新-------------- --------------------------

JSP:

    <body>
     <% 

 String usuario = (String)session.getAttribute("usuario");
 if (usuario == null) {
response.sendRedirect("Index.html");
return;
 }
 AtomicInteger sessionCount = (AtomicInteger)session.getAttribute("count");
 int count = sessionCount.incrementAndGet(); // count = ++sessionCount
  %>

伺服器:

 protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        String user = request.getParameter("usuario");
        String contra = request.getParameter("contrasena");

     HttpSession session = request.getSession();
      session.setAttribute("usuario", user);
      session.setAttribute("count", new AtomicInteger());

    if (userID.equals(user) && password.equals(contra)){
        Cookie Gerardocookie = new Cookie("usuario",user);
        Gerardocookie.setMaxAge(60 * 60);
        response.addCookie(Gerardocookie);
        response.sendRedirect("Procesardatos.jsp");
    } else{
        RequestDispatcher rd = getServletContext().getRequestDispatcher("/index.html");
        PrintWriter out = response.getWriter();
        out.println("<font color=red>Usuario y/o contrasena invalidas");
        rd.include(request, response);
    }
}

【问题讨论】:

    标签: java jsp servlets web-applications session-cookies


    【解决方案1】:

    Cookie 很容易被破解,因此简单地在 Cookie 中设置用户名对于确保安全几乎没有用处。任何会话 cookie 都可以作为永不过期的 cookie 复制到另一台计算机。

    建议您将用户名存储在会话中。即使 cookie 被盗,一旦服务器过期会话,它就变得毫无用处。 (您还可以采取其他措施来进一步提高安全性。)

    然后您可以使用计数器存储第二个会话属性:

    HttpSession session = request.getSession();
    session.setAttribute("usuario", user);
    session.setAttribute("count", new AtomicInteger());
    

    在后续请求中,您查询会话:

    HttpSession session = request.getSession();
    String usuario = (String)session.getAttribute("usuario");
    if (usuario == null) {
        response.sendRedirect("Index.html");
        return;
    }
    AtomicInteger sessionCount = (AtomicInteger)session.getAttribute("count");
    int count = sessionCount.incrementAndGet(); // count = ++sessionCount
    

    这与您的要求一致,但它会增加对执行此操作的服务器的每个 请求的计数器。如果除了登录页面之外的所有请求都是安全的,它们都会这样做,所以你基本上是在计算请求。

    【讨论】:

    • 我尝试使用您的代码来证明它...但我的 jsp 有错误...请检查我的编辑
    • 有我的更新,如何显示会话时间?或者我怎样才能将你分享给我的代码实现到我的应用中?
    • 不要同时 cookie和会话。删除 cookie 代码。 --- 当询问错误时,包括错误,否则我们不知道你在说什么。 可能是因为您没有声明session。你忘记了第一行。
    • 啊啊啊。 session 已提供给您。你不必得到它。与request 相同,您可以使用。有关已经可用的变量,请参见此处:tutorialspoint.com/jsp/jsp_implicit_objects.htm
    • yap... servlet 这样做:D.. 所以它现在可以工作了.. 我只是添加

      无需登录的刷新次数

    猜你喜欢
    • 2015-09-02
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2020-12-21
    相关资源
    最近更新 更多