繁体   English   中英

使用guice将CrossOriginFilter添加到dropwizard

[英]Add CrossOriginFilter to dropwizard using guice

我对Dropwizard和guice很陌生。 当我从本地Ajax代码中访问api时,在浏览器的控制台上出现以下错误。 所请求的资源上没有“ Access-Control-Allow-Origin”标头。 因此,不允许访问原始“空”。

研究完错误后,许多人建议将CrossORiginFilter添加到我的dropwizard代码中。 通过env.addFilter完成,但是我正在尝试使用Guice。 这是我的主班

public static void main( String[] args ) throws Exception
{
    new TListService().run( args );
}

@Override
public void initialize( Bootstrap<TListServiceConfiguration> bootstrap )
{
    bootstrap.setName( "tlist" );
    bootstrap.addBundle( GuiceBundle.< TListServiceConfiguration > newBuilder().addModule( new JpaPersistModule( this.getClass().getPackage().getName() ) ).setConfigClass( TListServiceConfiguration.class )
            .enableAutoConfig( this.getClass().getPackage().getName() ).build() );
}

@Override
public void run( TListServiceConfiguration config, Environment env ) throws Exception
{        
}

这是我的ajax代码:

$(document).ready(function() {
    $('#btnSend').click(function(){
        var apiUrl = $('#txtServer').val() + $("#selectApi").val();
        console.log("URL: " + apiUrl);
        var postData = JSON.parse($('#textData').val());
        console.log(postData);
        console.log(JSON.stringify(postData));
        $.ajax({
            url: apiUrl,
            async: false,
            type: 'POST',
            dataType:"json",
            contentType:"application/json; charset=UTF-8",
            data: JSON.stringify(postData),
        })
        .done(function(data) {
            console.log("success");
            console.log(data);
        })
        .fail(function() {
            console.error("Error");
        })
        .always(function() {
            console.log("complete");
        });
    });     
});

首先,创建一个过滤器以允许跨域请求

public class CrossDomainFilter implements Filter {
       public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

            HttpServletResponse res = (HttpServletResponse) response;

            res.setHeader("Access-Control-Allow-Origin", "*");
            res.setHeader("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
            res.setHeader("Access-Control-Allow-Credentials", "true");
            res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
            res.setHeader("Access-Control-Max-Age", "1209600");

            chain.doFilter(request, response);
        }
}

然后,在Service类的run()方法中添加映射

env.getApplicationContext().addFilter(CrossDomainFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR));

希望这可以帮助。

我们遇到了同样的问题,想要使用guice注入过滤器,到达的解决方案将GuiceBudle修改为支持acpet过滤器注入,在我们的情况下,仍然使用@WebFilter来执行此操作,否则您将不得不使用Environment。

在AutoConfig类中,您可以创建一个addFilters方法,该方法将使用该库来查找以@WebFilter注释的所有类的反射,如下所示:

public void addFilters(Environment env, Injector injector) {
    Set<Class<?>> annotatedClasses = reflections.getTypesAnnotatedWith(WebFilter.class);
    for (Class<?> annotated : annotatedClasses) {
        env.addFilter(injector.getInstance(annotated), annotated.getAnnotation(WebFilter.class).urlPatterns()[0];
    }
}

或者您可以稍后在run方法中添加过滤器:

@Override
public void run( TListServiceConfiguration config, Environment env ) throws Exception {      
    env.addFilter(Filter.class, "urlPatterns");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM