防止蜘蛛乱搞Tomcat会话

时间:2011-08-28 16:44:56

标签: java session tomcat servlets

我有一个相当新的网站(~3周龄)在Tomcat上运行,到目前为止访问量非常少。

在上周我发现了1,000多个活动会话,并且检查Tomcat的localhost_access *日志显示 绝大多数都来自这个范围内的IP:119.63.196。*这些都属于百度日本。

这是一个小例子,来自他们点击头版的日志。 119.63.196.107 - - [24 / Aug / 2011:07:02:46 +0000]“GET /; jsessionid = 94085F76780ACFD96C8109A29446288D HTTP / 1.1”200 10311 119.63.196.44 - - [24 / Aug / 2011:07:03:21 +0000]“GET /; jsessionid = 943133C77BB1756CF11592115BA81725 HTTP / 1.1”200 10333 119.63.196.39 - - [24 / Aug / 2011:07:03:56 +0000]“GET /; jsessionid = 9B4384BDECF540C8628467F7AB4AB463 HTTP / 1.1”200 10311 119.63.196.19 - - [24 / Aug / 2011:07:04:31 +0000]“GET /; jsessionid = A0B555C3A18377D993B97D4491DD1012 HTTP / 1.1”200 10311 119.63.196.45 - - [24 / Aug / 2011:07:05:10 +0000]“GET /; jsessionid = A3782FA61558BF11C4D5AC4F3DD1EC86 HTTP / 1.1”200 10311 119.63.196.23 - - [24 / Aug / 2011:07:05:53 +0000]“GET /; jsessionid = A3AF84EF13F21492EB47FAB001A1C2E5 HTTP / 1.1”200 10311 119.63.196.120 - - [24 / Aug / 2011:07:06:31 +0000]“GET /; jsessionid = A7C490CEC2C7F2969772AC4050C6D761 HTTP / 1.1”200 10311 119.63.196.108 - - [24 / Aug / 2011:07:07:07 +0000]“GET /; jsessionid = A7F769D354CB37E99843292D650D6367 HTTP / 1.1”200 10311

没有任何一个IP会破坏网站,但来自此IP系列的集体请求正在激活活动会话。而且他们似乎以一种协调的方式做到这一点,因为一次一页将被定位并在20分钟内在119.63.196。* IP范围内接收~30个不同的约30个点击。然后它将转移到另一个页面......这几天整天都在进行,并且会在Tomcat会话中进行调整。

我确实将非活动会话超时设置得相当高(720分钟),也许我需要将这个数字降低很多。也许百度日本经常进行检查,因为它认为页面因链接的变化而发生了变化(即jsessionid总是不同)?

感谢阅读。我欢迎任何/所有建议!

埃里克

2 个答案:

答案 0 :(得分:5)

如果配置CrawlerSessionManagerValve,Tomcat 7可以阻止创建数千个会话。有一个简短的documentation

此外,您可能需要考虑阻止Tomcat将会话ID放入URL,因为它会显示在搜索引擎中。再次从Tomcat 7开始,您可以配置:

<session-config>
   <tracking-mode>COOKIE</tracking-mode>
</session-config>

答案 1 :(得分:1)

蜘蛛确实通常不会与网站保持会话。这很正常。如果您的网站在正常的GET请求下创建会话,您应该问自己是否真的有必要。会话通常用于存储登录用户,其首选项(如语言环境等)。但蜘蛛根本不登录,他们根本不提交任何表格。那你为什么要创建会话?

基本上有两种方法可以解决这个“问题”:

  1. 修复您的网站,以便在没有必要时不会不必要地创建会话。仅在用户登录或创建/更新会话范围的首选项/变量时创建它。具体操作方法取决于您网站使用的API /框架。

  2. robots.txt阻止(特定)蜘蛛。

  3. 请注意,会话创建和会话本身并不是特别昂贵。空会话对象不应分配超过1KB。我发现你的会话超时太高了。 30分钟的默认值已经相对较多了。作为一个完全不同的替代方案,您还可以将其设置为5分钟或者其他内容并引入一个JS / Ajax“heartbeat”,每当用户在文档上处于活动状态时,它就会使用会话cookie发送每个超时1分钟的轮询请求(单击,按键等)。这将使服务器上的会话保持活动状态。您可以在this answer中找到一个示例。