【问题标题】:Adding a filter to a Glassfish server向 Glassfish 服务器添加过滤器
【发布时间】:2015-01-22 03:17:09
【问题描述】:

我在 Glassfish 3.1.2.2 下部署了一个 Java 应用程序,它使用 jersey 提供休息服务。前端写在angularjs。我的web.xml如下:

<web-app>
<servlet>
    <servlet-name>qpark rest service</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.restfulservice.restful;org.codehaus.jackson.jaxrs</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>qpark rest service</servlet-name>
    <url-pattern>/restservice/*</url-pattern>
</servlet-mapping>      
</web-app>

前端正在另一台服务器 (apache) 中运行。当从前端 Glassfish 发送请求时响应如下错误:

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin     'http://localhost' is therefore not allowed access.

这是逻辑,因为前端和后端由不同的服务器提供服务。为了避免这种情况,我配置了一个filter,它将Access-Control-Allow-Origin 添加到响应头中。此过滤器必须在web.xml 注册,如下所示:

<servlet>
    <servlet-name>Gateway Servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
        <param-value>com.filters.CrossOriginResourceSharingFilter</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

我的问题是我还想将第二个过滤器映射到每个 restservice。也就是说,我想添加这样的东西

<servlet-mapping>
    <servlet-name>Gateway Servlet</servlet-name>
    <url-pattern>/restservice/*</url-pattern>
</servlet-mapping>

但这是不允许的。

问题是如何在web.xml中添加/组合/注册这两个过滤器

【问题讨论】:

    标签: java angularjs cors web.xml servlet-filters


    【解决方案1】:

    您需要的不是 servlet,而是 servlet 过滤器。针对接口javax.servlet.Filter 实现您的servlet 过滤器。使用过滤器处理请求和/或响应,向请求/响应添加或删除信息,然后将其传递给链中的下一个过滤器(如果有)。

    package com.example.sample;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class Sample implements Filter{
    
        @Override
        public void destroy() {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                FilterChain chain) throws IOException, ServletException {
            // Process the request / response here. Add or remove the information you need.
            // Add or edit the headers you want to
            chain.doFilter(servletRequest, servletResponse);            
        }
    
        @Override
        public void init(FilterConfig arg0) throws ServletException {
    
    
        }
    }
    

    要使用过滤器,需要在web.xml中定义和映射如下:

    <!--  List of filters -->
    <filter>
        <filter-name>Authorization Filter</filter-name>
        <filter-class>com.example.sample.Sample</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Sample Filter</filter-name>
        <url-pattern>/foobar/*</url-pattern>
    </filter-mapping>
    

    【讨论】:

      【解决方案2】:

      Filters 独立添加 w.r.t.小服务程序

      <filter>
         <filter-name>ContainerResponseFilter</filter-name>
         <filter-class>com.filters.CrossOriginResourceSharingFilter</filter-class>
         <init-param>
            <param-name>...</param-name>
            <param-value>42</param-value>
         </init-param>
      </filter>
      <filter-mapping>
         <filter-name>ContainerResponseFilter</filter-name>
         <servlet-name>*</servlet-name>
      </filter-mapping>
      <servlet>
         ...
      

      【讨论】:

        猜你喜欢
        • 2018-03-14
        • 2020-05-12
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多