Зачем устанавливать директиву JSP page session = "false"?


мне было интересно, когда вы захотите установить следующую директиву страницы в JSP:

<%@ page session="false" %>

Я знаю, что это предотвращает создание объекта сеанса, но когда вам нужно это сделать? Считается ли это лучшей практикой, когда JSP не нужно обращаться к неявному сеансу?

Примечание:причина, по которой я спрашиваю, заключается в том, что это было в этом учебнике Spring MVC, и я предполагаю, что люди springsource знают их вещи - http://blog.springsource.com/2011/01/04/green-beans-getting-started-with-spring-mvc/

5 56

5 ответов:

одна из причин будет производительность и . Если у вас есть страница, которая не должна быть вовлечена в сеанс (например,about.jsp или faq.jsp) тогда поведение по умолчанию, включающее каждый JSP в сеанс, наложит накладные расходы на создание нового объекта сеанса (если он еще не существует) и увеличит использование памяти, поскольку больше объектов находятся в куче.

этот эффект будет сильно преувеличен в случае высокой видимости одной страницы трафик от многих уникальных пользователей в сочетании с высоким коэффициентом отказов, т. е. они пользователи не продолжают просматривать, но покидают сайт сразу после просмотра этой одной страницы - контейнер создаст новый объект сеанса для каждого пользователя, который никогда не будет использоваться снова и в конечном итоге будет собирать мусор после его тайм - аута-добавлен над головой создания объекта, использования памяти и сбора мусора, не давая вам никакой реальной ценности.

этот параметр также является мерой безопасности, а также позволяет избежать потенциальных DoS атака. Подумайте о простом скрипте, который итеративно wgets в JSP: он будет генерировать много сеансов в течение нескольких секунд.

У меня на самом деле есть реальный сценарий в моем приложении для его использования. У нас есть кальмар, действующий как обратный прокси перед нашим приложением. Сервер squid настроен на опрос всех экземпляров tomcat, на которых размещается наше приложение, чтобы убедиться, что серверы работают и работают, если это не так, Squid не сможет использовать другой сервер в нашем кластере.

фактический опрос нашего приложения из Squid установлен для опроса определенной страницы в приложении. Поскольку опрос Squid на самом деле не является браузером, он не удается провести сеанс, что означает, что каждый опрос на странице сервера будет иметь tomcat создать сеанс, на который Squid не может содержать ссылку. Мы добавляем <%@ page session="false" %> директива, чтобы сеанс не создавался на каждом опросе. Если бы мы не использовали эту директиву, у нас были бы тысячи сеансов, созданных в течение 4 часов без причины.

еще один случай использования, когда на самом деле требуется добавить эту директиву, - это использование Apache Shiro's на .ini конфигурационный файл, например, потому что ваша схема аутентификации не имеет состояния. Если вам этого не хватает, вы столкнетесь с org.apache.shiro.subject.support.DisabledSessionException.

столкнулся с другим вариантом использования в моем производственном приложении, решил, что я поделюсь им здесь, если это кому-то поможет.

У нас есть веб-приложение, которое защищает большинство ресурсов через сессии. Однако некоторые ресурсы защищены Частью веб-уровня, который находится перед нашим приложением в нашем производственном развертывании. Поэтому, что касается приложения, эти ресурсы полностью незащищены. Некоторые из этих "незащищенных" ресурсов являются JSP.

в случае, когда пользователь устанавливает сеанс на одном из наших защищенных ресурсов, затем делает вызов XHR из браузера на один из "незащищенных" ресурсов, мы столкнулись с проблемой, когда контейнер утверждает, что анонимный пользователь пытается получить доступ к сеансу пользователя фу, тем самым останавливая выполнение. Настройка "незащищенного" JSP, чтобы не использовать сеансы, помогла нам обойти эту проблему.