春天过滤器没有被调用 [英] Spring Filter not getting invoked

查看:123
本文介绍了春天过滤器没有被调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



过滤器是这样的:

  @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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆