[英]Dependency injection using guice in Dropwizard for set in constructor
[英]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.