20

我正在使用spring MVC并且在jsessionid中遇到问题,我发现如果在浏览器中未启用cookie,则会将jsessionid注入到url中,从而产生这样的url:

http://localhost/categories;jsessionid=Bsls4aQFXA5RUDcmZKV5iw?cid=13001

实际上浏览器没有问题,但是当谷歌抓取我的网站时,谷歌抓取工具似乎没有 cookie :),他们以这种形式存储我网站的网址,并且我的网站出现在搜索结果中,其网址类似于包含 jsessionid 的网址。

实际上它运行没有任何问题,但我更喜欢在没有 jsessionid 的情况下让 URL 清晰地出现在 Google 搜索结果中。

有什么帮助吗?

4

5 回答 5

19

直截了当:只要用户不登录或执行 POST 操作,就不要让您的应用程序创建会话。不要打电话request.getSession()request.getSession(true)。不要为未登录的用户创建或管理会话范围的 bean。确保您使用的框架不会在没有您说的情况下不必要地创建会话。

如果由于您的应用程序的设计方式或使用的 (MVC) 框架的限制/错误而这确实不可能,那么您最好的选择是将 Googlebot 请求重定向到没有 JSESSIONID 标识符的 URL。您可以为此使用Tuckey 的 URL 重写过滤器(例如,Apache HTTPD 的 well-known 的 Java 变体mod_rewrite)。这是其配置示例页面的相关性摘录。

隐藏来自 googlebot 的请求的 jsessionid。


<outbound-rule>
     <name>Strip URL Session ID's</name>
     <note>
         Strip ;jsession=XXX from urls passed through response.encodeURL().
         The characters ? and # are the only things we can use to find out where the jsessionid ends.
         The expression in 'from' below contains three capture groups, the last two being optional.
             1, everything before ;jesessionid
             2, everything after ;jesessionid=XXX starting with a ? (to get the query string) up to #
             3, everything ;jesessionid=XXX and optionally ?XXX starting with a # (to get the target)
         eg,
         from index.jsp;jsessionid=sss?qqq to index.jsp?qqq
         from index.jsp;jsessionid=sss?qqq#ttt to index.jsp?qqq#ttt
         from index.jsp;jsessionid=asdasdasdsadsadasd#dfds - index.jsp#dfds
         from u.jsp;jsessionid=wert.hg - u.jsp
         from /;jsessionid=tyu - /
     </note>
     <condition name="user-agent">googlebot</condition>
     <from>^(.*?)(?:\;jsessionid=[^\?#]*)?(\?[^#]*)?(#.*)?$</from>
     <to>$1$2$3</to>
 </outbound-rule>
于 2011-03-11T18:10:51.873 回答
11

Spring 可以配置为不这样做: Why jsessionid is appended to each url?

可以将 Web 应用程序配置为阻止它: http ://randomcoder.org/articles/jsessionid-considered-harmful

于 2011-03-11T18:16:50.010 回答
1

如果你不使用 Spring http 标签。
转到定义 Spring 过滤器链的 applicationFilterChain bean。
通常你会有一个名为 httpSessionContextIntegrationFilter 的过滤器或非常接近的过滤器,它基于类 org.springframework.security.web.context.HttpSessionContextIntegrationFilter 或继承自它。
添加属性:

<property name="securityContextRepository" ref="securityContextRepositoryNoJSession"/>

并添加 bean:

<bean id="securityContextRepositoryNoJSession" class="org.springframework.security.web.context.HttpSessionSecurityContextRepository">
    <property name="disableUrlRewriting" value="true"/>
</bean>


这应该相当于将 disable-url-rewriting 设置为 true

于 2014-05-27T13:04:11.853 回答
0

我会插入一个过滤器,如果它检测到机器人(如 googlebot)使用自定义 HttpServletResponse 覆盖 encodeUrl 方法以简单地返回原始 URL。如果过滤器没有检测到机器人,它只会让链继续,这应该让 url 编码等按照默认值继续。

于 2011-05-30T05:48:51.390 回答
0

摆脱 url 中的 jsessionid 的最简单方法是更改​​登录页面上调用 j_spring_security_check 的标记

<c:url var="authUrl" value="/static/j_spring_security_check" />
    <form action="${authUrl}" method="post">
于 2014-04-24T17:55:42.160 回答