Введение в фильтр
Фильтр также называется фильтром. Это самая практическая технология в технологии сервлета. Благодаря технологии фильтров, веб -разработчики перехватывают все веб -ресурсы, управляемые веб -серверами: такие как JSP, сервлет, статические файлы изображений или статические HTML -файлы, тем самым достигая некоторых специальных функций. Например, реализуйте некоторые расширенные функции, такие как контроль доступа к разрешению на уровне URL, фильтрация конфиденциального словаря и сжатие информации о ответе.
Он в основном используется для предварительного обработки запросов пользователей, а также может поступить Httpservletresponse. Полный процесс использования фильтра: фильтр предварительных обработок пользовательских запросов, а затем передайте запрос в сервлете для обработки и генерирует ответ и, наконец, отфильтровал пост-обработки ответа сервера.
Функция фильтра
1. Перехватите HttpservletRequest клиента, прежде чем httpservletrequest прибывает в сервлет. По мере необходимости проверьте HttpservletRequest, и вы также можете изменить заголовок и данные httpservlectrequest.
2. Перехватить httpservletresponse, прежде чем он достигнет клиента. По мере необходимости проверяйте Httpservletresponse, и вы также можете изменить заголовок и данные httpservletresponse и данные.
Как использовать фильтр для реализации функции перехвата
В интерфейсе фильтра есть метод Dofilter. Когда разработчик записывает фильтр и настраивает, какой веб -ресурс для перехвата, веб -сервер будет вызывать метод DoFilter фильтра каждый раз, прежде чем вызовать метод обслуживания веб -ресурса. Поэтому написание кода в этом методе может достичь следующей цели:
1. Пусть кусок кода выполняется перед вызовом целевого ресурса.
2. Называть ли целевой ресурс (то есть позволить пользователям получить доступ к веб -ресурсу).
Когда веб -сервер вызывает метод DoFilter, он пропустит объект FilterChain. Объект FilterChain является наиболее важным объектом в интерфейсе фильтра. Это также обеспечивает метод Dofilter. Разработчики могут решить, следует ли назвать этот метод в соответствии с их потребностями. Если этот метод будет вызван, веб -сервер будет вызвать метод обслуживания веб -ресурса, то есть доступ к веб -ресурсу будет доступен, в противном случае веб -ресурс не будет доступен.
Разработка фильтра два шага
Напишите класс Java, чтобы реализовать интерфейс фильтра и реализовать его метод DoFilter.
Используйте и элементы в файле web.xml для регистрации написанного класса фильтра и установить ресурсы, которые он может перехватить.
Введение в узлы конфигурации web.xml:
Элемент <фильтра> используется для установления ресурса, который фильтр отвечает за перехват. Фильтр перехват, ресурс может быть указан двумя способами: имя сервлета и путь запроса для доступа к ресурсам.
<servlet-name> указывает имя сервлета, перехваченное фильтром.
<Диспетчер> указывает, как ресурс, перехваченный фильтром, вызывается контейнером сервлета. Это может быть один из запросов, включения, первого и ошибки и запроса по умолчанию. Пользователи могут установить несколько подэлементов <Dispatcher> для указания фильтра для перехвата различных способов вызова ресурсов.
Значение и его значение, которое может установить дочерний элемент, заключается в следующем
Фильтруя цепочка
В веб -приложении могут быть разработаны и написаны несколько фильтров, которые объединяются в одну цепочку фильтров.
Веб -сервер решает, какой фильтр сначала вызовет в соответствии с порядком, в котором фильтр зарегистрирован в файле web.xml. Когда вызван метод DoFilter первого фильтра, веб -сервер создаст объект FilterChain, представляющий цепочку фильтра и передает его методу. В методе DoFilter, если разработчик вызывает метод DoFilter объекта FilterChain, веб -сервер проверит, есть ли все еще фильтр в объекте FilterChain. Если есть, называется второй фильтр, и если нет, целевой ресурс вызывается.
Жизненный цикл фильтра
public void init (FilterConfig FilterConfig) бросает ServletException; // инициализация
Как и программа сервлета, мы пишем, создание и уничтожение фильтра является обязанностью веб -сервера. Когда веб -приложение запускается, веб -сервер создаст объект экземпляра фильтра и вызовет его метод инициирования, чтобы прочитать конфигурацию web.xml для выполнения функции инициализации объекта, тем самым подготовившись к перехвату для последующих запросов пользователей (объект фильтра будет создан только один раз, и метод инициирования будет выполнен только один раз). Разработчики могут получить объект FilterConfig, представляющий текущую информацию о конфигурации фильтра с помощью параметров метода инициации.
Public void Dofilter (запрос ServletRequest, ответ Servletrespons
Этот метод завершает фактическую операцию фильтрации. Когда клиент запрашивает доступ к URL -адресу, связанному с фильтром, фильтр сервлета сначала выполнит метод Dofilter. Параметр FilterChain используется для доступа к последующим фильтрам.
Public void Destroy (); // уничтожить
Объект фильтра будет находиться в памяти после создания и будет уничтожен при удалении веб -приложения или остановлен сервер. Вызывается перед веб -контейнером, удаляет объект фильтра. Этот метод выполняется только один раз в течение жизненного цикла фильтра. В этом методе ресурсы, используемые фильтром, могут быть освобождены.
Интерфейс FilterConfig
При настройке фильтров пользователи могут настроить некоторые параметры инициализации для фильтров. Когда веб -контейнер создает объект Filter и вызывает метод своего инициирования, он будет проходить в объекте FilterConfig, который инкапсулирует параметры инициализации фильтра. Поэтому, когда разработчики пишут фильтры, они могут получить следующее содержимое с помощью метода объекта FilterConfig:
String getFiltername (); // Получить имя фильтра. String getInitParameter (String name); // Возвращает значение параметра инициализации с именем, указанным в описании развертывания. Если нет существования, верните NULL. Перечисление getInitParameterNames (); // Возвращает набор перечисления имен всех параметров инициализации фильтра. Public ServletContext getServletContext (); // Возвращает ссылку на объект контекста сервлета.
Файлтруя варианты использования
Используйте фильтр, чтобы проверить управление безопасностью входа в систему пользователя
Я участвовал в поддержании проекта некоторое время назад. После того, как пользователь вышел из системы, он отправился в адресную строку, чтобы получить доступ к истории. Согласно URL, он все еще мог ввести страницу ответа системы. Я проверил и обнаружил, что запрос не был отфильтрован, и подтвердил, что вход пользователя был вошел в систему. Добавьте фильтр для решения проблемы!
Сначала настроить его в web.xml
<Filter> <Filter-name> sessionFilter </filter-name> <Filter-class> com.action.login.sessionFilter </filter-class> <init-param> <param-name> logonstrings </param-meame> <!-Не фильтруйте страницу логина-> <param-value> /project/index.jsp; <Init-param> <param-name> includeStrings </param-name> <!-фильтр только указанный суффикс параметра фильтра-> <param-value> .do; .jsp </param-value> </init-param> <inate-param> <param-name> redirectpath </param-name> <! не через jump to grovin interface-param-value> <!-не через прыжок в login> <parame-value> <! </init-param> <init-param> <param-name> disabletestfilter </param-name> <!-y: Invalid Filter-> <param-Value> n </param-value> <!-http://www.manongjc.com/article/1613.html-> </init-param> </filter> <filter> <filter> <filter> <filter> <filter> <filter> <filter> <filter> <filter> <filter> <filter> <filter> <pilter> <filter-name> sessionfilter </filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Затем напишите Filterservlet.java:
пакет com.action.login; импорт java.io.ioexception; import javax.servlet.filter; import javax.servlet.filterchain; импорт javax.servlet.filterConfig; импорт javax.servlet.servletexception; impormesssersesples.servlece.servlece.servlece.servlece.servlex javax.servlet.http.httpservlectrequest; import javax.servlet.http.httpservletresponse; import javax.servlet.http.httpservletresponsewrapper;/*** Определить, зарегистрирован ли пользователь, и если он не зарегистрирован, выходите в систему* http://www.manongjc.com/article/1613.html */public class sessionfilter реализует фильтр {public filterConfig config; public void destress () {this.config = null; } public Static Boolean Iscontains (String Container, String [] regx) {boolean result = false; for (int i = 0; i <regx.length; i ++) {if (container.indexof (regx [i])! = -1) {return true; }} return result; } public void dofilter (запрос ServletRequest, ответ servletresponse, цепочка FilterChain). Httpservletresponsewrapper warper = new httpservletresponsewrapper ((httpservletresponse) ответ); String logonstrings = config.getinitParameter ("Logonstrings"); // Вход в строку страницы входа в систему includestrings = config.getinitParameter ("Includestrings"); // Фильтр ресурсов суффикс параметры string redirectpath = hrequest.getContextPath () + config.getInitParameter ("redirectPath"); // Нет входа в строку поворота string insabletestfilter = config.getinitParameter ("DisableTestFilter"); // - файл допустимого if (disabletestfilter.touppercase (). Equals ("y")) {// Invalid chain.dofilter (запрос, ответ); возвращаться; } String [] logonList = logonstrings.split (";"); String [] includeList = includeStrings.split (";"); if (! this.iscontains (hrequest.getRequesturi (), includeList)) {// Только отфильтровайте указанный параметр Filter Parameter Cave.dofilter (запрос, ответ); возвращаться; } if (this.iscontains (hrequest.getRequesturi (), logonlist)) {// не фильтруйте цепочку страницы входа. Dofilter (запрос, ответ); возвращаться; } String user = (string) hRequest.getSession (). GetAttribute ("userOnly"); // Судить, входит ли пользователь в систему if (user == null) {warper.sendreedirect (redirectpath); возвращаться; } else {chain.dofilter (запрос, ответ); возвращаться; }} public void init (filterConfig filterConfig) Throws ServletException {config = filterConfig; }}Таким образом, все запросы пользователю могут быть завершены, и вход пользователя должен быть проверен через этот фильтр.
Предотвратить китайские искаженные фильтры
Когда проект использует Spring Framework. Когда различные наборы символов используются на текущей странице JSP и коде Java для кодирования, будут искаженные проблемы с данными, представленными в форме, или загрузки/загрузки китайских файлов имен. Тогда вы можете использовать этот фильтр.
<Filter> <Filter-name> кодирование </filter-name> <Filter-class> org.springframework.web.filter.characterencodingfilter </filter-class> <inatparam> <-param-name> кодирование </param-ame> <! --- Используется для определения специфического набора символов-> <param-value> utf-ame> <! --- Для указания специфического набора символов-> <param-value> utf-8 </! <Init-param> <param-name> forceencoding </param-name> <!-true: независимо от того, указал ли запрос набор символов, используется кодирование; FALSE: Если в запросе указан набор символов, кодирование не используется-> <param-value> false </param-value> </init-param> </filter> <miftre-mapping> <filter-name> кодирование </filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <url-pattern>/*</url-pattern> </filter>
Spring+Hibernate OpensessionInViewFilter управляет переключением сеанса
Когда Hibernate+Spring используется в сочетании с ним, если устанавливается lazy = true (отсроченная загрузка), то при чтении данных Hibernate автоматически закроет сеанс после считывания родительских данных. Таким образом, когда вы хотите использовать связанные данные и данные ребенка, система принесет ошибку Lazyinit. В настоящее время вам нужно использовать фильтр OpenSessionInViewFilter, предоставленный весной.
OpenSessionInViewFilter в основном поддерживает состояние сеанса до тех пор, пока запрос не отправит все страницы клиенту и не закрывает сеанс до тех пор, пока запрос не будет выполнен, чтобы решить проблемы, вызванные ленивой загрузкой.
Примечание. Конфигурация OpenSessionInViewFilter должна быть записана перед конфигурацией Struts2. Поскольку контейнер Tomcat загружается последовательно при загрузке фильтра, если файл конфигурации сначала записывает конфигурацию фильтра Struts2, а затем конфигурация фильтра OpenSessionInViewFilter, порядок загрузки приводит к тому, что сеанс не управляется пружиной при получении данных.
<Filter> <!-ленивая загрузка, включенная в пружине-> <Filter-name> opensessionInviewfilter </filter-name> <filter-class> org.springframework.orm.hibernate3.support.opensessioninviewfilter </filter-class> <init-param> <param-name-name> sesescefactorybeanname </filter-class> <init-param> <param-namefactorybeanname </neface> </param-name> </param-name> <! По умолчанию фасоль с идентификатором в качестве SessionFactory из пружинного контейнера. Если идентификатор не является SessionFactory, вам нужно настроить его следующим образом. Здесь SessionFactory - это боб в весеннем контейнере. --> <param-value>sessionFactory</param-value> </init-param> <init-param> <param-name>singleSession</param-name><!-- singleSession defaults to true, if set to false, it is equal to no use OpenSessionInView --> <param-value>true</param-value> </init-param></filter><filter-mapping> <filter-name> opensessioninviewfilter </filter-name> <url-pattern>*. Do </url-pattern> </filter-mapping>
Конфигурация struts2 web.xml
Чтобы использовать Struts2 в проекте, вам также необходимо настроить фильтр в web.xml для перехвата запросов и перейти к действию Struts2 для обработки.
Примечание. Если в версии Struts2 до 2.1.3, фильтр использует org.apache.struts2.dispatcher.filterdispatcher. В противном случае используйте org.apache.struts2.dispatcher.ng.filter.strutspreareAndexecutefilter. Начиная со стойки 2.1.3, фильтр ActionContextCleanup будет отброшен, в то время как соответствующая функциональность включена в фильтр StrutSpRearAndExecuteFilter.
Настроены три параметра инициализации:
<!-- struts 2.x filter --><filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping> <filter-name>struts2</filter-name> <Url-pattern>*. Do </url-pattern> </filter-mapping>
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!