使用HttpSession对象记录网站的访问次数

做这个遇到点问题,所以写下来与大家共勉

先说说Session对象,一个会话,同Cookie不同,是将所有信息存放到服务器,而在Cookie中存放一个JSESSIONID,当访问网页的所属域时,浏览器会自动将JSESSIONID通过请求头发送出去,服务器接受到了这个id,就会将数据从服务器中拿出来,借用这个机制,就可以存放一些信息
具体的Session的生命周期等,还是买本书吧。

直接上源代码

package com.test1;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class Access_statistics
 */
@WebServlet(description = "对网站的访问进行统计的案例", urlPatterns = { "/Access_statistics" })
public class Access_statistics extends HttpServlet {
    private static final long serialVersionUID = 1L;

    int count;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

           HttpSession session=request.getSession();
           session.setAttribute("count",count);

           if(session.getAttribute("count")!=null){
               count=(int) session.getAttribute("count")+1;
              session.setAttribute("count",count);
           }
           //在这里Count的作用非常大,作为一个缓存对象
           //缓存了Session的信息,但是这个程序非常
        response.setCharacterEncoding("utf-8");
             PrintWriter printWriter=response.getWriter();
             printWriter.println("<meta charset=utf-8>");
             printWriter.println("当前访问次数"+count);
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

}

上面的源代码看似有问题,当时访问起来会发现有没有问题
,说话很矛盾,之后会说的,先截图验证
这里写图片描述
这里写图片描述

我来解释,由于Session对象是依赖于Cookie的,当然这是我的理解,因为拿到Session对象的实例,是依赖于Cookie中的SessionID,当然我所说的不是在Cookie关闭后使用URL重写技术,就上面的代码而言,Session对象是会话结束后就会销毁,与之对相应的Cookie也是一样,当时当我关闭fireFox发现却依旧能用,研究代码发现了一个原因,不知道这是好还是坏,原因在这里

 count=(int) session.getAttribute("count")+1;

在session对象存在的情况下,会将session对象的值拿出加一后放入count的缓存域中,当我们关闭浏览器,Session对象是会话结束后就会销毁,与之对相应的Cookie也是一样,再一次请求这个页面,count中缓存的数据会拿出来,将数据从新返回,这时访问量的数量依旧,不会变为0,然后重新加。但是这个程序也存在问题,当服务器关闭时,内存中的数据被销毁,这时你再去访问,所有的数据没了

所以本身来说这个程序就存在问题,所以现在的问题就是如何处理这个count,当然这个方法很多,例如文件,磁盘,数据库等。

既然session对应的Cookies会被销毁掉,当然也是有解决方案的
1.简单粗暴

        HttpSession session=request.getSession();
        session.setMaxInactiveInterval(60*60);
        session.setAttribute("user","admin");
        session.setAttribute("password","123456");

        Cookie[] cookies=request.getCookies();

       for (int i = 0; i < cookies.length; i++) {
        if(cookies[i].getName().equals("JSESSIONID")){
            cookies[i].setMaxAge(60*60);//存放一个小时
            response.addCookie(cookies[i]);
            System.out.println("存在这样的Cookie");
        }

这也是一种解决方案,
2使用web.xml进行配置

<session-config>
  <session-timeout>30</session-timeout>
  <cookie-config>
  <max-age>3600</max-age>
  </cookie-config>
  </session-config>

说白了,和上面没什么两样,找到那个存放了JSESSIONID
的cookie,对他设置存活时间,从而达到继续访问的目的

猜你喜欢

转载自blog.csdn.net/qq_37657081/article/details/78946310