春天过滤器没有被调用 [英] Spring Filter not getting invoked
问题描述
过滤器是这样的:
@Component
public class SimpleCORSFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest req,
HttpServletResponse res,FilterChain filterChain)
throws ServletException,IOException {
System.out.println(EXECUTING);
HttpServletResponse响应=(HttpServletResponse)res;
response.setHeader(Access-Control-Allow-Origin,*);
response.setHeader(Access-Control-Allow-Methods,
POST,GET,OPTIONS,DELETE);
response.setHeader(Access-Control-Max-Age,3600);
response.setHeader(Access-Control-Allow-Headers,
X-Requested-With,Content-Type);
filterChain.doFilter(req,res);
$ b然后,我在web.xml中添加了过滤器,如下所示:
<?xml version =1.0encoding =UTF-8?>
< web-app xmlns:xsi =http://www.w3.org/2001/XMLSchema-instance
xmlns =http://java.sun.com/xml/ns / javaee
xsi:schemaLocation =http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd
version =2.5>
<! - 所有Servlet共享的Root Spring容器的定义
和Filters - >
< context-param>
< param-name> contextConfigLocation< / param-name>
< param-value> /WEB-INF/spring/servlet-context.xml< / param-value>
< / context-param>
< listener>
< listener-class> org.springframework.web.context.ContextLoaderListener< / listener-class>
< / listener>
< servlet>
< servlet-name> rest< / servlet-name>
< servlet-class> org.springframework.web.servlet.DispatcherServlet< / servlet-class>
<加载启动> 1< /加载启动>
< / servlet>
< servlet-mapping>
< servlet-name> rest< / servlet-name>
< url-pattern> / *< / url-pattern>
< / servlet-mapping>
< filter>
< filter-name> simpleCORSFilter< / filter-name>
< filter-class> org.lh.gestorepazienti.web.SimpleCORSFilter< / filter-class>
< / filter>
< filter-mapping>
< filter-name> simpleCORSFilter< / filter-name>
< servlet-name> rest< / servlet-name>
< / filter-mapping>
< filter>
< filter-name> OpenSessionInViewFilter< / filter-name>
< filter-class> org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter< / filter-class>
< / filter>
< filter-mapping>
< filter-name> OpenSessionInViewFilter< / filter-name>
< url-pattern> / *< / url-pattern>
< / filter-mapping>
< / web-app>
哪里可能有错?
servlet-context.xml 是不常见的 。当使用spring-mvc时,这个名字通常用于 DispatcherServlet
配置。你最好使用 applicationContext.xml
。
但是无论如何,你应该使用 DelegatingProxyFilter
允许正确初始化spring filter:
< filter>
< filter-name> simpleCORSFilter< / filter-name>
< filter-class> org.springframework.web.filter.DelegatingFilterProxy< / filter-class>
< / filter>
DelegatingProxyFilter 将在根上下文中搜索a名为 simpleCORSFilter
的bean,并将 doFilter
方法委托给它。
I added a CORS filter to my application, but it does not seem to be executed (no prints).
The filter is this:
@Component
public class SimpleCORSFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest req,
HttpServletResponse res, FilterChain filterChain)
throws ServletException, IOException {
System.out.println("EXECUTING");
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods",
"POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers",
"X-Requested-With,Content-Type");
filterChain.doFilter(req, res);
}
}
Then I added the filter in the web.xml, which is the following:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!-- The definition of the Root Spring Container shared by all Servlets
and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/servlet-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>rest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>rest</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>simpleCORSFilter</filter-name>
<filter-class>org.lh.gestorepazienti.web.SimpleCORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>simpleCORSFilter</filter-name>
<servlet-name>rest</servlet-name>
</filter-mapping>
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Where could it be possibly wrong?
解决方案 First, it is uncommon to name the Root Spring Container xml file servlet-context.xml
. This name is normally used for the DispatcherServlet
configuration when using spring-mvc. You'd better use applicationContext.xml
.
But anyway, you should use a DelegatingProxyFilter
to allow proper initialization of the spring filter :
<filter>
<filter-name>simpleCORSFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
The DelegatingProxyFilter
will search in root context a bean named simpleCORSFilter
and will delegate the doFilter
method to it.
这篇关于春天过滤器没有被调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文