【问题标题】:Java filter doesn't work, when I tried to make request当我尝试发出请求时,Java 过滤器不起作用
【发布时间】:2020-08-12 04:07:12
【问题描述】:

我有这个 Cors 过滤器:

public class SimpleCorsFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("here");
        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");
        chain.doFilter(req, res);
        System.out.println("here2");

    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

}

而且它似乎不起作用。这是我的 web.xml:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>


    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:app-context.xml</param-value>
    </context-param>

    <filter>
        <filter-name>SimpleCORSFilter</filter-name>
        <filter-class>org.heller.filter.SimpleCorsFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SimpleCORSFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>app</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>app</servlet-name>
        <url-pattern>/app/*</url-pattern>
    </servlet-mapping>
</web-app>

有人可以告诉我如何使这个过滤器工作吗?当我尝试请求时,控制台中没有消息,,here”。我看了很多教程,代码似乎很好。应该是一些错误,我没有看到。谢谢你的帮助。

【问题讨论】:

  • 在命令行上使用curl 发出请求并显示生成的标头的输出可能会有所帮助。此外,也许启用跟踪/调试记录我的显示更多信息。很高兴知道您是如何测试它的。
  • 是的,我用邮递员试过了,现在过滤器可以工作了,而且标题没问题。

标签: java servlet-filters


【解决方案1】:

这是我的过滤器:-

包 com.test.test.apis.filter;

public class AuthenticationFilter implements Filter{

    private FilterConfig filterConfig;;
    private List<String> excludedApiUrls;


    protected ServletContext servContext;

     private static final String AUTHENTICATION_HEADER_KEY = "Authorization";
     private static final String AUTHENTICATION_HEADER_VALUE_PREFIX = "Bearer "; // with trailing space to separate token

     @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;       
        String excludePattern = filterConfig.getInitParameter("excludedUrls");
        excludedApiUrls = Arrays.asList(excludePattern.split(","));
    } 



    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws IOException, ServletException {
        if (filterConfig == null) return;
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        if(!"OPTIONS".equalsIgnoreCase(request.getMethod())) {

            // filter logic
        }else {
            filterChain.doFilter(request, servletResponse);
        }


    }

    @Override
    public void destroy() {
        filterConfig = null;
    }

}

CORS 配置:-

package com.test.test.apis.filter;
public class CORSFilter implements ContainerResponseFilter {
    @Override
    public ContainerResponse filter(ContainerRequest request,ContainerResponse response) {

        response.getHttpHeaders().add("Access-Control-Allow-Origin", "*");
        response.getHttpHeaders().add("Access-Control-Allow-Headers","origin, content-type, accept, authorization");
        response.getHttpHeaders().add("Access-Control-Allow-Credentials", "true");
        response.getHttpHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");

        return response;
    }
}

web.xml;-

<filter>
        <filter-name>ApiFilter</filter-name>
        <filter-class>com.test.test.apis.filter.AuthenticationFilter</filter-class>
        <init-param>
            <param-name>excludedUrls</param-name>
            <param-value>/tb/login/doLogin</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>ApiFilter</filter-name>
        <servlet-name>api-serlvet</servlet-name>
    </filter-mapping>

<servlet>
        <servlet-name>api-serlvet</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.test.test.apis.controllers</param-value>
        </init-param>
        <init-param>
          <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
          <param-value>com.test.test.apis.filter.CORSFilter</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>api-serlvet</servlet-name>
        <url-pattern>/test/*</url-pattern>
    </servlet-mapping>

【讨论】:

    【解决方案2】:

    我的 web.xml 看起来像:

    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
        <display-name>Archetype Created Web Application</display-name>
    
    
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:app-context.xml</param-value>
        </context-param>
    
        <filter>
            <filter-name>SimpleCORSFilter</filter-name>
            <filter-class>org.heller.filter.SimpleCorsFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>SimpleCORSFilter</filter-name>
            <servlet-name>app</servlet-name>
        </filter-mapping>
    
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
        <servlet>
            <servlet-name>app</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value></param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>app</servlet-name>
            <url-pattern>/app/*</url-pattern>
        </servlet-mapping>
    </web-app>
    

    现在它运行了!谢谢你的帮助!

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 2021-05-18
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      相关资源
      最近更新 更多