Я хотел бы устранить HttpSession полностью - я могу сделать это в web.xml? Я уверен, что существуют контейнерные особенные методы сделать это (который является тем, что переполняет результаты поиска, когда я делаю поиск Google).
P.S. Действительно ли это - плохая идея? Я предпочитаю полностью отключать вещи, пока мне на самом деле не нужны они.
Я хотел бы полностью избавиться от HttpSession
Вы не можете полностью отключить его. Все, что вам нужно сделать, это просто не обращаться к нему либо request.getSession()
, либо request.getSession(true)
в любом месте кода вашего веб-приложения и убедиться, что ваши JSP не делают этого неявно, устанавливая <%@page session="false"%>
.
Если ваша главная забота - это отключение cookie, которые используются за кулисами HttpSession
, то в Java EE 5 / Servlet 2.5 вы можете сделать это только в конфигурации webapp для конкретного сервера. Например, в Tomcat вы можете установить атрибут cookies
в false
в элементе
.
<Context cookies="false">
Также смотрите эту документацию по Tomcat. Таким образом, сессия не будет сохраняться в последующих запросах, которые не переписывают URL -- только когда вы по какой-то причине выхватываете ее из запроса. В конце концов, если она вам не нужна, просто не хватайте ее, тогда она вообще не будет создана/сохранена.
Или, если вы уже на Java EE 6 / Servlet 3.0 или новее, и действительно хотите сделать это через web.xml
, тогда вы можете использовать новый
элемент в web. xml
следующим образом, чтобы обнулить максимальный возраст:
<session-config>
<session-timeout>1</session-timeout>
<cookie-config>
<max-age>0</max-age>
</cookie-config>
</session-config>
Если вы хотите жестко прописать в своем веб-приложении, чтобы getSession()
никогда не возвращала HttpSession
(или "пустую" HttpSession
), тогда вам нужно создать фильтр, слушающий url-pattern
из /*
, который заменяет HttpServletRequest
на HttpServletRequestWrapper
реализацию, которая возвращает на всех getSession()
методах null
, или фиктивную пользовательскую реализацию HttpSession
, которая ничего не делает, или даже бросает UnsupportedOperationException
.
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(new HttpServletRequestWrapper((HttpServletRequest) request) {
@Override
public HttpSession getSession() {
return null;
}
@Override
public HttpSession getSession(boolean create) {
return null;
}
}, response);
}
P.S. Это плохая идея? Я предпочитаю полностью отключать вещи, пока они мне действительно не понадобятся.
Если они вам не нужны, просто не используйте их. Вот и все. Правда :)
Я хотел бы полностью удалить HttpSession - могу ли я сделать это в web.xml? Я уверен, что есть способы сделать это, специфичные для контейнера
Я так не думаю. Отключение HttpSession
будет нарушением спецификации сервлетов, в которой говорится, что HttpServletRequest # getSession
должен возвращать сеанс или создавать его. Поэтому я бы не ожидал, что контейнер Java EE предоставит такую опцию конфигурации (которая сделает его несовместимым).
Это плохая идея? Я предпочитаю полностью отключать вещи, пока они мне действительно не понадобятся.
Ну, я не совсем понимаю, просто не добавляйте ничего в сеанс, если вы не хотите это использовать. Теперь, если вы действительно хотите предотвратить использование сеанса, вы можете использовать Фильтр
, чтобы заменить запрос реализацией HttpServletRequestWrapper
, переопределяющей getSession ()
.Но я бы не стал тратить время на реализацию этого:)
Обновление: Мое первоначальное предложение не было оптимальным, «правильным» ( кашлем ) способом было бы заменить запрос.
Вместо отключения вы можете переписать URL-адрес, используя фильтр перезаписи URL, например фильтр перезаписи tuckey . Это даст удобные для Google результаты, но по-прежнему позволит обрабатывать сеанс на основе файлов cookie.
Однако вам, вероятно, следует отключить его для всех ответов, так как это хуже, чем просто недружелюбие поисковых систем. Он предоставляет идентификатор сеанса, который может использоваться для определенных эксплойтов безопасности .
Пример конфигурации для фильтра Таки:
<outbound-rule encodefirst="true">
<name>Strip URL Session ID's</name>
<from>^(.*?)(?:\;jsessionid=[^\?#]*)?(\?[^#]*)?(#.*)?$</from>
<to>$1$2$3</to>
</outbound-rule>