HttpURLConnection 在 J2EE 应用程序中跳过 FILTER
HttpURLConnection skipping the FILTER in J2EE application
我正在处理应用程序,它在通过代码连接到 http URL 时跳过应用程序中配置的过滤器。其中一个过滤器是配置了 URL 模式 /*
的 UTF8Filter。下面是我的 URL 连接的代码片段。
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
此时,我不确定问题是出在基于 FORM 的身份验证还是出在 HTTPUrl 连接代码或某些其他配置上。感谢任何帮助。
更新:
根据要求,我正在更新 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>
我认为您的过滤器不会拦截您的代码使用 HttpURLConnection
发出的请求,因为它不在过滤器的范围内。可以在容器(您的 tomcat 服务器)级别配置过滤器以拦截使用容器 API 触发的请求,类似于 RequestDispatcher 的 forward()
(或)include()
。基本上,JAVA EE6 过滤器可以在 web.xml 中配置为以下 <dispatcher>
类型
- REQUEST:仅当请求直接来自客户端时
- ASYNC:仅当异步请求来自客户端时
- FORWARD:仅当请求已转发到组件时
- INCLUDE:当组件正在处理请求时
已包含
- 错误:仅在处理请求时出现错误
页面机制
Servlet 过滤器的默认调度程序设置为 REQUEST,因此 Servlet 过滤器只处理对您的资源的直接请求。
表单身份验证由 Servlet 容器直接处理(而不是 Web 应用程序本身)。然后 servlet 容器将请求转发到您的应用程序,转发到您登录表单的资源。转发请求时不处理 Servlet 过滤器(具有默认的 REQUEST 调度程序绑定/映射)!
尝试将 UTF8 过滤器的 Servlet 过滤器映射更新为
<filter-mapping>
<filter-name>UTF8Filter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
我已经在 Tomcat 上测试了该解决方案,当使用 FORM 身份验证并且在 Sevlet 过滤器映射中指定了调度程序 FORWARD 时,会触发 Sevlet 过滤器。
我正在处理应用程序,它在通过代码连接到 http URL 时跳过应用程序中配置的过滤器。其中一个过滤器是配置了 URL 模式 /*
的 UTF8Filter。下面是我的 URL 连接的代码片段。
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
此时,我不确定问题是出在基于 FORM 的身份验证还是出在 HTTPUrl 连接代码或某些其他配置上。感谢任何帮助。
更新: 根据要求,我正在更新 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>
我认为您的过滤器不会拦截您的代码使用 HttpURLConnection
发出的请求,因为它不在过滤器的范围内。可以在容器(您的 tomcat 服务器)级别配置过滤器以拦截使用容器 API 触发的请求,类似于 RequestDispatcher 的 forward()
(或)include()
。基本上,JAVA EE6 过滤器可以在 web.xml 中配置为以下 <dispatcher>
类型
- REQUEST:仅当请求直接来自客户端时
- ASYNC:仅当异步请求来自客户端时
- FORWARD:仅当请求已转发到组件时
- INCLUDE:当组件正在处理请求时 已包含
- 错误:仅在处理请求时出现错误 页面机制
Servlet 过滤器的默认调度程序设置为 REQUEST,因此 Servlet 过滤器只处理对您的资源的直接请求。
表单身份验证由 Servlet 容器直接处理(而不是 Web 应用程序本身)。然后 servlet 容器将请求转发到您的应用程序,转发到您登录表单的资源。转发请求时不处理 Servlet 过滤器(具有默认的 REQUEST 调度程序绑定/映射)!
尝试将 UTF8 过滤器的 Servlet 过滤器映射更新为
<filter-mapping>
<filter-name>UTF8Filter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
我已经在 Tomcat 上测试了该解决方案,当使用 FORM 身份验证并且在 Sevlet 过滤器映射中指定了调度程序 FORWARD 时,会触发 Sevlet 过滤器。