Я могу выключить HttpSession в web.xml?

Я хотел бы устранить HttpSession полностью - я могу сделать это в web.xml? Я уверен, что существуют контейнерные особенные методы сделать это (который является тем, что переполняет результаты поиска, когда я делаю поиск Google).

P.S. Действительно ли это - плохая идея? Я предпочитаю полностью отключать вещи, пока мне на самом деле не нужны они.

55
задан Elnur Abdurrakhimov 21 April 2013 в 09:51
поделиться

3 ответа

Я хотел бы полностью избавиться от 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. Это плохая идея? Я предпочитаю полностью отключать вещи, пока они мне действительно не понадобятся.

Если они вам не нужны, просто не используйте их. Вот и все. Правда :)

73
ответ дан 7 November 2019 в 07:21
поделиться

Я хотел бы полностью удалить HttpSession - могу ли я сделать это в web.xml? Я уверен, что есть способы сделать это, специфичные для контейнера

Я так не думаю. Отключение HttpSession будет нарушением спецификации сервлетов, в которой говорится, что HttpServletRequest # getSession должен возвращать сеанс или создавать его. Поэтому я бы не ожидал, что контейнер Java EE предоставит такую ​​опцию конфигурации (которая сделает его несовместимым).

Это плохая идея? Я предпочитаю полностью отключать вещи, пока они мне действительно не понадобятся.

Ну, я не совсем понимаю, просто не добавляйте ничего в сеанс, если вы не хотите это использовать. Теперь, если вы действительно хотите предотвратить использование сеанса, вы можете использовать Фильтр , чтобы заменить запрос реализацией HttpServletRequestWrapper , переопределяющей getSession () .Но я бы не стал тратить время на реализацию этого:)

Обновление: Мое первоначальное предложение не было оптимальным, «правильным» ( кашлем ) способом было бы заменить запрос.

2
ответ дан 7 November 2019 в 07:21
поделиться

Вместо отключения вы можете переписать 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>
2
ответ дан 7 November 2019 в 07:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: