GlassFish: How to set Access-Control-Allow-Origin header

后端 未结 4 675
没有蜡笔的小新
没有蜡笔的小新 2020-12-05 21:49

I am using the latest version of GlassFish. I want to set the Access-Control-Allow-Origin header in response so that my API which is hosted on GlassFish can be called from a

相关标签:
4条回答
  • 2020-12-05 22:20

    The best and easiest way of doing this, is right click on the project

    and select Cross-Origin Resource Sharing Filter

    0 讨论(0)
  • 2020-12-05 22:28

    In my case, the API requests are exclusively handled by Jersey, therefore I can set response headers in a ContainerResponseFilter:

    package my.app;
    
    import com.sun.jersey.spi.container.ContainerRequest;
    import com.sun.jersey.spi.container.ContainerResponse;
    import com.sun.jersey.spi.container.ContainerResponseFilter;
    
    public class CrossOriginResourceSharingFilter implements ContainerResponseFilter {
    
        @Override
        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");
            cresp.getHttpHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type, Accept");
    
            return cresp;
        }
    }
    

    The filter gets enabled in 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>my.app.CrossOriginResourceSharingFilter</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    

    If you don't use Jersey, I guess you can create a similar servlet response filter.

    0 讨论(0)
  • 2020-12-05 22:41

    Here is a Java EE standard way to do it. It's almost exactly the same as the Jersey example except for the library packages used (javax) and the method call to get the headers is different (getHeaders).

    import java.io.IOException;
    import javax.ws.rs.container.ContainerRequestContext;
    import javax.ws.rs.container.ContainerResponseContext;
    import javax.ws.rs.container.ContainerResponseFilter;
    import javax.ws.rs.ext.Provider;
    
    @Provider
    public class RestResponseFilter implements ContainerResponseFilter{
    
    @Override
        public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException{
            responseContext.getHeaders().putSingle("Access-Control-Allow-Origin", "*");
            responseContext.getHeaders().putSingle("Access-Control-Allow-Credentials", "true");
            responseContext.getHeaders().putSingle("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
            responseContext.getHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type, Accept");
        }
    
    }
    
    0 讨论(0)
  • 2020-12-05 22:44

    Since you use the tag java-ee-6, I believe @Provider isn't supported. I used the following code, based on the javaee6 tutorial:

    import java.io.IOException;
    import java.util.logging.Logger;
    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.annotation.WebFilter;
    import javax.servlet.http.HttpServletResponse;
    
    @WebFilter(filterName = "AddHeaderFilter", urlPatterns = {"/*"})
    public class ResponseFilter implements Filter {
    
      private final static Logger log = Logger.getLogger(ResponseFilter.class.getName() );
    
      @Override
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        if (response instanceof HttpServletResponse) {
          log.info("Adding headers");
          HttpServletResponse http = (HttpServletResponse) response;
          http.addHeader("Access-Control-Allow-Origin", "*");
          http.addHeader("Access-Control-Allow-Credentials", "true");
          http.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
        } 
        chain.doFilter(request, response);
    }
    
    0 讨论(0)
提交回复
热议问题