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


Answers:


68

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

Tomcat 6(6.0.30之前的版本)

您可以使用tuckey重写过滤器

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开始,您可以在会话配置中添加以下内容。

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

6
当您无法创建会话cookie时,为什么要使用重写器?
英国电信

1
请查看此答案的日期。Tomcat 7和跟踪模式功能在2009年不可用。现在已更新每个版本的信息。
游泳池

Tomcat 6在执行此操作的Context元素上支持'disableURLRewriting'属性。参见tomcat.apache.org/tomcat-6.0-doc/config/context.html

谢谢,这已在Tomcat 6.0.30中添加。我将再次更新答案。
2014年

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

Tomcat 7和Tomcat 8在您的Web应用程序web.xml中支持上述配置,该配置将禁用基于URL的会话。


3
不要忘记使用web-app_3.0 xsd:<web-app xmlns:xsi =“ 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/javaee java.sun.com/xml/ns/javaee/web- app_3_0.xsd “ id =” CHANGEME“ version =” 3.0“>
koppor 2013年

19

可以在Tomcat 6.0中执行以下操作:disableURLRewriting

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规范。



5

引用Pool的答案:

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

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

值得一提的是,即使jsessionid不再可见,它仍将允许基于cookie的会话处理。(摘自他的另一篇文章:我可以关闭web.xml中的HttpSession吗?

PS。我没有足够的名声可以发表评论,否则我会把它添加到上面的他的评论中。


4

在Tomcat 6.0中,您可以从tomcat安装目录的/ config路径中对context.xml使用disableURLRewriting =“ true”。

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输出它对搜索引擎友好...

请享用


2

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

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

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

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

干杯,马克


2

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

您可以在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。
BalusC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.