2

如果用户在应用程序中有一些活动,当用户下次返回应用程序时,有没有办法找出请求来自同一台 PC?
问题的另一方面是保护应用程序免受机器人攻击。

以防万一解决方案依赖于 AS,我对部署在 Glassfish v3.x 上的 Web 应用程序特别感兴趣。我的应用程序是用 JSF2 创建的,但我认为这并不重要。

4

2 回答 2

2

您可以将包含唯一令牌的 cookie 写入浏览器,并将其存储在数据库的用户配置文件中。当用户再次登录时,将唯一令牌传递给服务器并与存储在数据库中用户配置文件中的令牌进行比较。

我只是做了一些阅读,似乎获取 MAC 地址是不可能的:如何从 HttpServlet 获取客户端的 MAC 地址?

于 2012-04-07T18:01:56.543 回答
1

注意:可靠识别返回用户的唯一方法是通过身份验证。使用 cookie,您实际上是在检查来自同一浏览器的返回连接。

如果用户清除 cookie、重新安装浏览器、使用其他浏览器或使用其他计算机,您的 Web 应用程序很可能不会记住它们。话虽如此,这是一种无需身份验证即可识别返回用户的方法:

HttpSession是检测返回用户的一种方法。当用户在您的 Web 应用程序上有活动时,您可以存储唯一标识该用户的密钥。这会在他们的浏览器中放置一个 cookie,以便当他们返回时,您的 Web 应用程序可以从会话中提取该数据。

从 HttpSession javadocs:

提供一种在多个页面请求或访问网站时识别用户并存储有关该用户的信息的方法。

记录用户活动:

ArrayList activity = new ArrayList<String>();

activity = (ArrayList<String>) request.getSession().getAttribute("activity");

if(activity == null)
    activity = new ArrayList<String();

activity.add("Searched for parts for Ford Thunderbird");
request.getSession().setAttribute("activity", activity);

显示用户活动:

ArrayList activity = new ArrayList<String>();
activity = (ArrayList<String>) request.getSession().getAttribute("activity");

if(activity == null) {
    log.info("No activity to display. New user");

} else {
    for(String a : activity) {
        log.info(a);
    }
}

在 web.xml 中设置超时:

<!-- Define the default session timeout for your application,
     in minutes.  From a servlet or JSP page, you can modify
     the timeout for a particular session dynamically by using
     HttpSession.getMaxInactiveInterval(). -->

<session-config>
  <session-timeout>30</session-timeout>    <!-- 30 minutes -->
</session-config>
于 2012-04-07T18:04:46.513 回答