2014-11-24 1 views
1

У меня есть приложение Java, развернутое под Glassfish 3.1.2.2, которое использует jersey для обслуживания отдыхающих. Передний конец написан в angularjs. Мой web.xml выглядит следующим образом:Добавление фильтра на сервер Glassfish

<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

ответ

1

Что вам нужно, это не сервлет, а фильтр сервлетов. Внедрите свой сервлет-фильтр по интерфейсу javax.servlet.Filter. Используйте фильтр для обработки запроса и/или ответа, добавления или удаления информации в запрос/ответ, а затем передайте его следующему фильтру в цепочке (если есть).

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

Отлично! Это работает. благодаря – Luixv

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