發表於 程式分享

apache cxf 跨域资源共享CORS問題處理

1.新增RESTCorsResponseFilter.java

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.container.PreMatching;
import javax.ws.rs.ext.Provider;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

@Provider
@PreMatching
public class RESTCorsResponseFilter implements ContainerResponseFilter {
    protected Logger logger = LogManager.getLogger(this.getClass().getName());

    @Override
    public void filter( ContainerRequestContext requestCtx, ContainerResponseContext responseCtx ) throws IOException {
        logger.info( "Executing REST response filter" );

        responseCtx.getHeaders().add( "Access-Control-Allow-Origin", "*" );
        responseCtx.getHeaders().add( "Access-Control-Allow-Credentials", "true" );
        responseCtx.getHeaders().add( "Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS" );
        responseCtx.getHeaders().add("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");
    }
}

2.新增RESTCorsRequestFilter.java

import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.PreMatching;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

@Provider
@PreMatching
public class RESTCorsRequestFilter implements ContainerRequestFilter {
    protected Logger logger = LogManager.getLogger(this.getClass().getName());

    @Override
    public void filter( ContainerRequestContext requestCtx ) throws IOException {
        logger.info( "Executing REST request filter" );

        // When HttpMethod comes as OPTIONS, just acknowledge that it accepts...
        if ( requestCtx.getRequest().getMethod().equals( "OPTIONS" ) ) {
            logger.info( "HTTP Method (OPTIONS) - Detected!" );

            // Just send a OK signal back to the browser
            requestCtx.abortWith( Response.status( Response.Status.OK ).build() );
        }
    }
}

3.apache-cxf-services.xml
beans element / jaxrs:server element加上
<ref bean="RESTCorsResponseFilter" />
<ref bean="RESTCorsRequestFilter" />

beans element內加上
<bean id="RESTCorsResponseFilter" class="com.xxx.servlet.RESTCorsResponseFilter"/>
<bean id="RESTCorsRequestFilter" class="com.xxx.servlet.RESTCorsRequestFilter"/>