是否可以在 tomcat servlet 中禁用 jsessionid?

Posted

技术标签:

【中文标题】是否可以在 tomcat servlet 中禁用 jsessionid?【英文标题】:Is it possible to disable jsessionid in tomcat servlet? 【发布时间】:2010-11-01 01:18:46 【问题描述】:

是否可以在tomcat的url中关闭jsessionid? jsessionid 似乎对搜索引擎不太友好。

【问题讨论】:

【参考方案1】:

您可以使用此过滤器仅对搜索引擎禁用,但我建议将其用于所有响应,因为它比仅对搜索引擎不友好更糟糕。它公开了可用于某些安全漏洞的会话 ID (more info)。

Tomcat 6(6.0.30 之前)

您可以使用tuckey rewrite filter。

Example config 用于 Tuckey 过滤器:

<outbound-rule encodefirst="true">
  <name>Strip URL Session ID's</name>
  <from>^(.*?)(?:\;jsessionid=[^\?#]*)?(\?[^#]*)?(#.*)?$</from>
  <to>$1$2$3</to>
</outbound-rule>

Tomcat 6(6.0.30 及更高版本)

您可以在上下文配置中使用disableURLRewriting 来禁用此行为。

Tomcat 7 和 Tomcat 8

来自Tomcat 7 onwards,您可以在会话配置中添加以下内容。

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

【讨论】:

既然无法创建会话 cookie,为什么还要使用重写器? 请查看此答案的日期。 Tomcat 7 和跟踪模式功能在 2009 年不可用。现在更新了每个版本的信息。 Tomcat 6 支持执行此操作的 Context 元素上的“disableURLRewriting”属性。见tomcat.apache.org/tomcat-6.0-doc/config/context.html 谢谢,这是在 Tomcat 6.0.30 中添加的。我会再次更新答案。【参考方案2】:
 <session-config>
     <tracking-mode>COOKIE</tracking-mode>
 </session-config> 

Tomcat 7 和 Tomcat 8 在您的 web-app web.xml 中支持上述配置,这会禁用基于 URL 的会话。

【讨论】:

别忘了使用 web-app_3.0 xsd: w3.org/2001/XMLSchema-instance" xmlns="java.sun.com/xml/ns/javaee" xmlns:web="java.sun.com/xml/ns/javaee/web-app_3_0.xsd" xsi:schemaLocation="java.sun.com/xml/ns/javaeejava.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="CHANGEME" version="3.0">【参考方案3】:

在 Tomcat 6.0 中可以这样做: 禁用URL重写

http://tomcat.apache.org/tomcat-6.0-doc/config/context.html

例如

<?xml version='1.0' encoding='utf-8'?>
<Context docBase="PATH_TO_WEBAPP" path="/CONTEXT" disableURLRewriting="true">
</Context>

在 Tomcat 7.0 中,这由应用程序中的以下内容控制: ServletContext.setSessionTrackingModes()

Tomcat 7.0 遵循 Servlet 3.0 规范。

【讨论】:

【参考方案4】:

在所有将response 包装在HttpServletResponseWrapper 中的URL 上使用Filter,该HttpServletResponseWrapper 仅返回与encodeRedirectUrlencodeRedirectURLencodeUrlencodeURL 相同的URL。

【讨论】:

此处提供示例代码:randomcoder.com/articles/jsessionid-considered-harmful 服务器可能已关闭;我不得不从 Google 的缓存中取出它。【参考方案5】:

引用 Pool 的回答:

您可以使用 tukey 重写过滤器。

您可以禁用仅搜索 使用此过滤器的引擎,但我会 建议将其用于所有响应 它比搜索引擎更糟糕 不友好。它公开了会话 ID 可用于某些安全性 漏洞利用(更多信息)。

值得一提的是,即使 jsessionid 不再可见,这仍然允许基于 cookie 的会话处理。 (摘自他的另一个帖子:Can I turn off the HttpSession in web.xml?)

PS。我没有足够的声誉来发表评论,否则我会将此作为评论添加到他上面的帖子中。

【讨论】:

【参考方案6】:

在 Tomcat 6.0 中,您可以使用 disableURLRewriting="true" 从您的 Tomcat 安装的 /config 路径进入 context.xml。

http://tomcat.apache.org/tomcat-6.0-doc/config/context.html

context.xml 文件

<?xml version='1.0' encoding='utf-8'?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!-- The contents of this file will be loaded for each web application -->
<Context disableURLRewriting="true">

    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->

    <!-- Uncomment this to enable Comet connection tacking (provides events
         on session expiration as well as webapp lifecycle) -->
    <!--
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
    -->

</Context>

...

现在 tomcat 输出它对搜索引擎友好...

享受

【讨论】:

【参考方案7】:

此外,如果您在 Tomcat 前面安装了 Apache,您可以使用 mod_rewrite 过滤器去除 jsession。

将以下内容添加到您的 apache 配置中。

#Fix up tomcat jsession appending rule issue
RewriteRule  ^/(.*);jsessionid=(.*) /$1 [R=301,L]

这将执行 301 重定向到没有 jsessionid 的页面。显然这将完全禁用 url jsessionid,但这是我需要的。

干杯, 标记

【讨论】:

【参考方案8】:

默认情况下,在 Tomcat 服务器中启用 cookie(您可以通过在 server.xml 的元素中使用 cookies=true 来显式设置它)。启用 cookie 意味着 jsessionID 不会附加到 URL,因为会话将使用 cookie 进行管理。 然而,即使在启用 cookie 之后,jsessionID 也会附加到第一个请求的 URL 中,因为在那个阶段网络服务器不知道是否启用了 cookie。要删除此类 jsessionID,您可以使用 tukey 重写规则:

您可以在http://javatechworld.blogspot.com/2011/01/how-to-remove-jsessionid-from-url-java.html找到更多信息

<outbound-rule encodefirst="true">
    <note>Remove jsessionid from embedded urls - for urls WITH query parameters</note>
    <from>^/(.*);jsessionid=.*[?](.*)$</from>
    <to encode="false">/$1?$2</to>
</outbound-rule>

<outbound-rule encodefirst="true">
    <note>Remove jsessionid from embedded urls - for urls WITHOUT query parameters</note>
    <from>^/(.*);jsessionid=.*[^?]$</from>
    <to encode="false">/$1</to>
</outbound-rule>

您可以在http://javatechworld.blogspot.com/2011/01/how-to-remove-jsessionid-from-url-java.html找到更多信息

【讨论】:

请注意,网络浏览器仍然需要启用 cookie。

以上是关于是否可以在 tomcat servlet 中禁用 jsessionid?的主要内容,如果未能解决你的问题,请参考以下文章

Servlet之Tomcat配置与启动

带有变量的 Servlet 映射(Tomcat 7.0)

Servlet在启动时加载的tomcat源码(原创)

java 一个tomcat上可以装几个网站?几个war?几个servlet?

Tomcat如何快速响应静态资源(DefaultServlet+浏览器缓存)

Tomcat如何快速响应静态资源(DefaultServlet+浏览器缓存)