将过滤器添加到Glassfish服务器

时间:2014-11-24 11:59:13

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

我在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

中添加/组合/注册这两个过滤器

2 个答案:

答案 0 :(得分:2)

您需要的不是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>

答案 1 :(得分:0)

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>
   ...