удалить jsessionid в URL-адресе, переписать весной mvc

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

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

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

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

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


person mmohab    schedule 11.03.2011    source источник


Ответы (5)


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

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

Скрыть 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>
person BalusC    schedule 11.03.2011
comment
Я всегда впечатлен вашими ответами. - person gigadot; 11.03.2011
comment
BalusC должен писать книги. Я первый в очереди на покупку :) - person Sergii Shevchyk; 18.11.2014


Если вы не используете HTTP-тег Spring.
Перейдите к bean-компоненту 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-rewrite значения true.

person roizaig    schedule 27.05.2014

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

person mP.    schedule 30.05.2011

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

<c:url var="authUrl" value="/static/j_spring_security_check" />
    <form action="${authUrl}" method="post">
person user2784713    schedule 24.04.2014