2015-02-19 4 views
0

Я работаю над приложением, которое пропускает ФИЛЬТРЫ, настроенные в приложении, при подключении к URL-адресу http через код. Одним из фильтров является UTF8Filter, настроенный с шаблоном URL /*. Ниже приведен фрагмент кода моего URL-соединения.HttpURLConnection, пропускающий FILTER в приложении J2EE

String protocol = "http"; 
String port = "50000"; 
String host = "localhost"; 
URL url = new URL(protocol + "://" + host + ":" + port + path + "/" 
     + fs + "_" + fsv + ".jspx?id=" + wid + "&rt=pdf"); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.disconnect(); 
conn.setUseCaches(false); 
conn.setDefaultUseCaches(false); 
conn.setDoOutput(true); 
if (jsessionid != null) { 
    conn.addRequestProperty("Cookie", jsessionid.getName() + "=" 
      + jsessionid.getValue()); 
} 
logger.info("Before connect...."); 
conn.connect(); 
logger.info("After connect..."); 
logger.info("get response code : " + conn.getResponseCode());//200 

Ниже приведен журнал, записанный в приложении.

INFO GPBean:201 - Before connect.... 
INFO GPBean:203 - After connect... 
INFO GPBean:207 - get response code : 200 
--- It has skipped the filters. Request hasn't gone through the UTF8Filter. 

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

Я попытался удалить модуль аутентификации и протестировать приложение. Он работает нормально.

Ниже приведено видеоизображение, в котором отключена аутентификация на основе форм.

19 Feb 2015 12:32:19,289 INFO GPBean:201 - Before connect.... 
19 Feb 2015 12:32:19,292 INFO GPBean:203 - After connect... 
19 Feb 2015 12:32:19,363 INFO UTF8Filter:38 - In UTF8Filter class, doFilter() method... 
19 Feb 2015 12:32:19,365 INFO UTF8Filter:41 - In UTF8 Filter, Filtering the request 
-----some other log messages 
19 Feb 2015 12:32:27,017 INFO GPBean:207 - get response code : 200 

На данный момент, я не уверен, чтобы решить, если проблема с аутентификацией, основанной на форме или с HTTPUrl кодом соединения или какой-либо другой конфигурации. Любая помощь приветствуется.

UPDATE: В соответствии с просьбой, я обновление с фрагментом моей web.xml

<filter> 
     <filter-name>RF</filter-name> 
     <filter-class>com.srk.filters.RF</filter-class> 
    </filter> 
    <filter> 
     <filter-name>UTF8Filter</filter-name> 
     <filter-class>com.srk.filters.UTF8Filter</filter-class> 
     <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
     </init-param> 
    </filter> 
    <filter-mapping> 
     <filter-name>RF</filter-name> 
     <servlet-name>Persistent Faces Servlet</servlet-name> 
    </filter-mapping> 
    <filter-mapping> 
     <filter-name>RF</filter-name> 
     <servlet-name>Faces Servlet</servlet-name> 
    </filter-mapping> 
    <filter-mapping> 
     <filter-name>UTF8Filter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>0</load-on-startup> 
    </servlet> 
    <servlet> 
     <servlet-name>Persistent Faces Servlet</servlet-name> 
     <servlet-class>com.icesoft.faces.webapp.xmlhttp.PersistentFacesServlet</servlet-class> 
     <load-on-startup>0</load-on-startup> 
    </servlet> 
    <servlet> 
     <servlet-name>Blocking Servlet</servlet-name> 
     <servlet-class>com.icesoft.faces.webapp.xmlhttp.BlockingServlet</servlet-class> 
     <load-on-startup>0</load-on-startup> 
    </servlet> 
    <servlet> 
     <servlet-name>uploadServlet</servlet-name> 
     <servlet-class>com.icesoft.faces.component.inputfile.FileUploadServlet</servlet-class> 
     <load-on-startup>0</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Persistent Faces Servlet</servlet-name> 
     <url-pattern>*.faces</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>Persistent Faces Servlet</servlet-name> 
     <url-pattern>*.jspx</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>Persistent Faces Servlet</servlet-name> 
     <url-pattern>*.iface</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>Persistent Faces Servlet</servlet-name> 
     <url-pattern>/xmlhttp/*</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>Blocking Servlet</servlet-name> 
     <url-pattern>/block/*</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>uploadServlet</servlet-name> 
     <url-pattern>/uploadHtml</url-pattern> 
    </servlet-mapping> 
+1

Что вы конфигурируете 'UTF8Filter' - вы используете web.xml или аннотации? Если я не ошибаюсь, вам нужно добавить «FORWARD» -Dispatcher к вашему картографированию фильтров. – chearius

+0

Я использую web.xml, никаких аннотаций. – srk

ответ

3

Я думаю, что ваш фильтр не будет перехватывать запросы, сделанные с помощью кода HttpURLConnection, как это не в область действия фильтра. Фильтр может быть настроен на уровне контейнера (вашего сервера tomcat) для перехвата запросов, запущенных с использованием API-контейнера, как-то вроде RequestDispatcher's forward() (или) include(). В основном фильтр JAVA EE6 может быть сконфигурирован в web.xml со следующими <dispatcher> Типы

  • ЗАПРОС: Только тогда, когда запрос поступает непосредственно от клиента
  • ASYNC: Только когда асинхронный запрос исходит от клиента
  • ВПЕРЕД: только тогда, когда запрос был направлен к компоненту
  • Включают: когда запрос обрабатывается компонентом , который был включен
  • оШИБКА: только тогда, когда запрос обрабатывается с ошибкойстраницы механизма
+0

Но тот же HttpUrlConnection проходит через фильтр, когда я отключил проверку подлинности на основе FORM, как указано в вопросе. – srk

+0

Можете ли вы добавить конфигурацию диспетчера в filter-mapping в web.xml? – Arkantos

+0

@srk Параметр диспетчера по умолчанию для фильтра HTTP является запросом, поэтому фильтруются только прямые запросы. Чтобы выполнить проверку подлинности FORM, контейнер сервлета обрабатывает запрос до того, как он достигнет вашего фильтра, и перенаправит его в целевую форму. Как упоминал Аркантос, попробуйте указать REQUEST и FORWARD как диспетчер в вашем web.xml. – chearius

1

По умолчанию параметр диспетчера для Servlet фильтра REQUEST, поэтому только прямые запросы к вашему ресурсу, обрабатывается с помощью сервлет Filter.

Аутентификация подлинности обрабатывается непосредственно контейнером сервлетов (а не самим веб-приложением). Затем контейнер сервлета пересылает запрос в ваше приложение, к ресурсу с вашей формой входа. Фильтры сервлета (с привязкой/отображением диспетчера по умолчанию REQUEST) не обрабатываются при отправке запросов!

Попробуйте обновить Servlet отображение фильтра для UTF8Filter в

<filter-mapping> 
    <filter-name>UTF8Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

Я проверил решение на Tomcat и Sevlet фильтр сработал, когда аутентификация FORM используется и диспетчеру FORWARD указан в Sevlet Фильтр отображение.