удалить jsessionid в URL переписать весной MVC - PullRequest
19 голосов
/ 11 марта 2011

Я использую Spring MVC и у меня проблема с jsessionid. Я обнаружил, что jsessionid внедряется в URL, если в браузере не включены файлы cookie, создающие URL:

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

На самом деле с браузерами проблем нет, но когда Google сканирует мой сайт и кажется, что у сканеров Google нет файлов cookie :), они сохраняют URL-адреса моего сайта в этой форме, и мой сайт появляется в результатах поиска с URL-адресами.например, содержащие jsessionid.

На самом деле он работает без проблем, но я предпочитаю, чтобы URL-адреса в результатах поиска Google отображались без jsessionid.

Любая помощь?

Ответы [ 5 ]

19 голосов
/ 11 марта 2011

Кстати, просто не позволяйте вашему приложению создавать сеансы, пока пользователи не входят в систему и не выполняют действия POST. Не звоните request.getSession() или request.getSession(true). Не создавайте и не управляйте bean-объектами сессий для пользователей, не вошедших в систему. Убедитесь, что используемые вами фреймворки не создают ненужных сеансов без того, чтобы вы это сказали.

Если это действительно невозможно из-за способа разработки вашего приложения или из-за ограничений / ошибок используемых сред (MVC), тогда лучше всего перенаправлять запросы робота Googlebot на URL-адреса без JSESSIONID идентификатор. Для этого вы можете использовать фильтр перезаписи URL Tuckey (скажем, Java-вариант хорошо известного mod_rewrite в Apache HTTPD). Вот выдержка из страницы примеров конфигурации .

Скрыть jsessionid для запросов от googlebot.


<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>
11 голосов
/ 11 марта 2011

Spring может быть настроен так, чтобы не делать этого: Почему jsessionid добавляется к каждому URL?

Веб-приложения могут быть настроены для его блокировки: http://randomcoder.org/articles/jsessionid-considered-harmful

1 голос
/ 27 мая 2014

Если вы не используете Spring http-тег.
Перейдите к вашему компоненту applicationFilterChain, который определяет цепочки фильтров Spring.
Обычно у вас будет фильтр с именем httpSessionContextIntegrationFilter или что-то очень близкое, основанное на классе org.springframework.security.web.context.HttpSessionContextIntegrationFilter или унаследованное от него.
Добавить недвижимость:

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

И добавить боб:

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


Это должно быть эквивалентно установке disable-url-rewriting в true

0 голосов
/ 24 апреля 2014

Самый простой способ избавиться от jsessionid в вашем URL - это поменять тег на странице входа, где вызов j_spring_security_check на

<c:url var="authUrl" value="/static/j_spring_security_check" />
    <form action="${authUrl}" method="post">
0 голосов
/ 30 мая 2011

Я бы вставил фильтр, который, если он обнаруживает бота (например, googlebot), использует пользовательский HttpServletResponse, который переопределяет методы encodeUrl, чтобы просто возвращать необработанный URL.Если фильтр не обнаруживает бота, он просто позволяет цепочке продолжаться, что должно позволить кодировке URL и т. Д. Продолжать работу по умолчанию.

...