2014-05-15 4 views
9

कहलाता है, मैं एक छोटी सी रेस्ट सर्विस सेवा बनाकर जर्सी सीखने की कोशिश कर रहा हूं। मैं विशिष्ट कारणों से फ़िल्टर का उपयोग करना चाहता हूं (जैसे कि कंटेनर रिस्पॉन्सफ़िल्टरCORS शीर्ष डोमेन अनुरोधों को अनुमति देने के लिए शीर्षलेखों का उपयोग करना चाहते हैं)। हालांकि, मैं इन फ़िल्टरों को मेरी कॉल को अवरुद्ध करने में सक्षम नहीं हूं। मैंने इस समस्या के लिए सभी पोस्ट देखी हैं और उनमें से अधिकतर एनोटेशन प्रदाता या web.xml में पंजीकरण करने के लिए कहते हैं। मैं कंटेनरकंटेनररक्वेटफिल्टर कंटेनर रीस्पॉन्सफिल्टर डोजेंट

यहाँ के लिए एक @Provider एनोटेशन दे रही है और साथ ही web.xml में फ़ाइलों को पंजीकृत करने की कोशिश की है मेरे web.xml है

<?xml version="1.0" encoding="UTF-8"?> 
<!-- This web.xml file is not required when using Servlet 3.0 container, 
    see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html#d4e194 --> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/classes/spring/config/BeanLocations.xml</param-value> 
    </context-param> 

    <servlet> 
     <servlet-name>Jersey Web Application</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.rest.example</param-value> 
     </init-param> 
     <init-param> 
      <param-name>jersey.config.server.provider.packages</param-name> 
      <param-value>com.rest.example.cors</param-value> 
     </init-param> 
     <init-param> 
      <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name> 
      <param-value>com.rest.example.CORSFilter</param-value> 
     </init-param> 
     <init-param> 
      <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name> 
      <param-value>com.rest.example.RequestFilter</param-value> 
     </init-param> 

    </servlet> 
    <servlet-mapping> 
     <servlet-name>Jersey Web Application</servlet-name> 
     <url-pattern>/webresources/*</url-pattern> 
    </servlet-mapping> 

</web-app> 

यहाँ मेरी फिल्टर कर रहे हैं:

package com.rest.example.cors; 

import javax.ws.rs.ext.Provider; 

import com.sun.jersey.spi.container.ContainerRequest; 
import com.sun.jersey.spi.container.ContainerResponse; 
import com.sun.jersey.spi.container.ContainerResponseFilter; 

@Provider 
public class CORSFilter implements ContainerResponseFilter { 

    public ContainerResponse filter(ContainerRequest creq, 
      ContainerResponse cresp) { 

      cresp.getHttpHeaders().putSingle("Access-Control-Allow-Origin", "*"); 
      cresp.getHttpHeaders().putSingle("Access-Control-Allow-Credentials", "true"); 
      cresp.getHttpHeaders().putSingle("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD"); 
      cresp.getHttpHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With"); 

      return cresp; 
    } 
} 


package com.rest.example.cors; 

import javax.ws.rs.ext.Provider; 

import com.sun.jersey.spi.container.ContainerRequest; 
import com.sun.jersey.spi.container.ContainerRequestFilter; 

@Provider 
public class RequestFilter implements ContainerRequestFilter { 

    public ContainerRequest filter(ContainerRequest request) { 
     System.out.println("request filter"); 
     return request; 
    } 

} 

Link मेरी जिथब परियोजना में।

मैं यहां 2 दिनों के लिए फंस गया हूं।

धन्यवाद

+0

जर्सी का कौन सा कंटेनर/ऐप सर्वर और संस्करण आप उपयोग कर रहे हैं? साथ ही, क्या आपने अपने जर्सी एप्लिकेशन क्लास में अपने फ़िल्टर पंजीकृत करने का प्रयास किया है? – Baldy

+0

मैं जर्सी संस्करण 1.8 का उपयोग कर रहा हूँ। मैं वीएमवेयर वीएफएब्रिक का उपयोग कर रहा हूं जो एसटीएस के साथ आता है। हम जर्सी एप्लिकेशन क्लास में फ़िल्टर कैसे पंजीकृत करते हैं? – user2973475

+0

अपने फ़िल्टर पंजीकृत करने के लिए, उन्हें अपने 'javax.ws.rs.core.Aplication' ऑब्जेक्ट में 'getClasses' विधि' में जोड़ें, हालांकि ऐसा लगता है कि आपका web.xml आपके लिए इसे संभालना चाहिए। क्या आपकी आरईएसटी विधियों को बुलाया जा रहा है? आप कैसे जानते हैं कि आपके फ़िल्टर नहीं बुलाए जा रहे हैं? – Baldy

उत्तर

7

मैं एक जर्सी आवेदन वर्ग जोड़ा गया है और कक्षा में फिल्टर, जो मेरी समस्या हल पंजीकृत। इसके अलावा मेरे जर्सी संस्करण के लिए उन्नत 1.x से 2.x के लिए

public class MyApplication extends ResourceConfig { 

    /** 
    * Register JAX-RS application components. 
    */ 
    public MyApplication() { 
     register(RequestContextFilter.class); 
     register(JacksonFeature.class); 
     register(CustomerResource.class); 
     register(Initializer.class); 
     register(JerseyResource.class); 
     register(SpringSingletonResource.class); 
     register(SpringRequestResource.class); 
     register(CustomExceptionMapper.class); 
    } 
} 
+2

कि जर्सी 2.24 बिलाव 8.5 लेकिन मैं में तैनात में मेरे लिए काम किया भी इस प्रकार' web.xml' में आवेदन वर्ग रजिस्टर करने के लिए किया था '(org.glassfish.jersey.servlet.ServletContainer' के लिए सर्वलेट परिभाषा के अंदर) –

1

<init-param> 
 
    <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name> 
 
    <param-value>org.anchepedheplatform.infrastructure.core.filters.ResponseCorsFilter</param-value> 
 
</init-param>

पहले, मैं एक वर्ग जो com.sun.jersey.spi.container.ContainerResponseFilter

import javax.ws.rs.core.Response; 
import javax.ws.rs.core.Response.ResponseBuilder; 

import com.sun.jersey.spi.container.ContainerRequest; 
import com.sun.jersey.spi.container.ContainerResponse; 
import com.sun.jersey.spi.container.ContainerResponseFilter; 

/** 
* Filter that returns a response with headers that allows for Cross-Origin 
* Requests (CORs) to be performed against the platform API. 
*/ 
public class ResponseCorsFilter implements ContainerResponseFilter { 

    @Override 
    public ContainerResponse filter(final ContainerRequest request, final ContainerResponse response) { 
     final ResponseBuilder resp = Response.fromResponse(response.getResponse()); 
     resp.header("Access-Control-Allow-Origin", "*") 
     .header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); 
     final String reqHead = request.getHeaderValue("Access-Control-Request-Headers"); 
     if (null != reqHead && !reqHead.equals(null)) { 
     resp.header("Access-Control-Allow-Headers", reqHead);} 
     response.setResponse(resp.build()); 
     return response; 
} 

लागू करता है लिखा था और बाद में मैं रखा था intit-param web.xml में इस कक्षा का यह संदर्भ।

+1

क्या आपने यहां दिया गया कोड [जर्सी और कंटेनर रीस्पॉन्सफ़िल्टर के साथ सीओआरएस-कॉम्प्लेन्ट आरईएसटी एपीआई] (http://blog.usul.org/ कॉर्स-अनुपालन-आराम-एपीआई-साथ-जर्सी-एंड-कंटेनरस्पॉन्सफिल्टर /)? – Athafoud

3

मैं Wildfly पर समस्या हल 10/बाकी आसान की तरह इस (CORSFilter मेरी ContainerResponseFilter है):

import java.util.HashSet; 
import java.util.Set; 

import javax.ws.rs.ApplicationPath; 
import javax.ws.rs.core.Application; 

@ApplicationPath("/rest") 
public class JaxRsActivator extends Application { 

    @Override 
    public Set<Class<?>> getClasses() { 
     final Set<Class<?>> resources = new HashSet<Class<?>>(); 

     resources.add(CORSFilter.class); 

     return resources; 
    } 
} 
+0

धन्यवाद यह मेरी समस्या भी थी। –

0

आप ResourceConfig वर्ग सभी प्रदाताओं के पंजीकरण की प्रक्रिया का विस्तार कर रहे हैं थकाऊ एक और संभावना हो सकती है क्या वहां कोई भी कुछ प्रदाताओं को याद कर सकता है।

ResourceConfig के प्रकार के साथ क्या किया जा सकता है, क्या आप packages("") निर्दिष्ट करने के लिए डिफ़ॉल्ट कन्स्ट्रक्टर में संकुल विधि का उपयोग कर सकते हैं जिसमें आपके शेष संसाधन और प्रदाता शामिल होंगे।

public class CustomResourceConfig extends ResourceConfig{ 
    public CustomResourceConfig(){ 
     super(); 
     packages("com.test.poc.rest;com.test.poc.providers"); 
     //register any custom features 
     register(JacksonFeature.class);   // enabling JSON feature. 
    } 
} 

और उछाल जर्सी अब अपनी webservices @Path साथ एनोटेट के लिए और प्रदाताओं के लिए स्कैन करेगा: हम एक पैकेज com.test.poc.rest जो सभी बाकी सेवाओं में शामिल है और एक अन्य पैकेज है अर्थात् com.test.poc.providers तो हमारे resourceConig तरह दिखेगा कहना उदाहरण देता है के लिए @Provider के साथ एनोटेटेड।