微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

访问控制允许起源不允许起源 – 如何使用一个非常简单的networking堆栈和guice启用CORS

我不确定问题是涉及的技术,还是我对技术的理解。

我有一个HTML5应用程序写在JavaScript和HTML托pipe在Apache 2.2服务器上。

我有一个用java编写的java应用程序,它使用了一个简单的REST服务的jetty,guice,jackson,jersey。

这两个应用程序运行在同一个盒子上,一个在端口80上(纯Apache5上的html5应用程序),另一个在8080上(纯Java应用程序托pipe在jetty / guice上)

apache mod_proxy,为跨域Ajax调用configurationProxyPass&ProxyPassReverse

如何在XAMPP上启用跨源资源共享?

从浏览器上传文件到另一个域的最好方法是什么?

angular js Nginx cors – 没有“Access-Control-Allow-Origin”标题

绕过“选项请求”的authentication(所有的头都在响应中发送)

我相信答案是在发送回来的标题。 CORS头文件告诉浏览器你允许外部应用程序打你的api。 我似乎无法弄清楚如何configuration我的Jetty,Guice服务器返回正确的CORS头。

我正在使用一个模拟Jetty服务器,所以我没有一个web.xml文件添加标题

这也可能与HTML5应用程序服务器(在本例中为apache 2.2)如何为应用程序提供服务有关。

Apache的httpd.conf文件有条目:

LoadModule headers_module modules/mod_headers.so <IFModule mod_headers> Header add Access-Control-Allow-Origin "*" Header add Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE,HEAD Header add Access-Control-Allow-Headers: X-PINGOTHER Header add Access-Control-Max-Age: 1728000 </IfModule>

在我的guice servletconfiguration中,我有以下几点:

public class RestModule extends ServletModule{ @Override protected void configureServlets() { bind(QuestbookService.class); // hook Jersey into Guice Servlet bind(GuiceContainer.class); // hook Jackson into Jersey as the POJO <-> JSON mapper bind(JacksonjsonProvider.class).in(Scopes.SINGLetoN); Map<String,String> guiceContainerConfig = new HashMap<String,String>(); guiceContainerConfig.put(ResourceConfig.PROPERTY_RESOURCE_FILTER_FACTORIES,HttpStatusCodeMetricResourceFilterFactory.class.getCanonicalName()); serve("/*").with(GuiceContainer.class,guiceContainerConfig); } }

我认为这个问题是在我的guiceconfiguration,因为我没有一个地方设置响应头。

我正在使用embedded式docker服务器,因此我认为开发模式将绕过整个检查,但我可能是错的。

谢谢你的任何build议。

如何configurationWAMP apache服务器以允许跨域请求ajax?

设置Nginx允许跨域请求子域

在Apache中使用Access-Control-Allow-Origin标头处理多个域

跨域分块上传使用CORS

飞行前OPTIONS请求故障转移HTTPS

做到我的应用程序的具体要求。 服务器需要完全从客户端中断。 客户端应该能够通过任何方法连接到通信服务器。

由于这个应用程序的第一个实现将被REST驱动,我需要能够从任何地方接受休息。

另外,我想要一个完整的xml-less配置,所以我使用带有嵌入式Jetty服务器的Guice。 由于我没有web.xml文件,我无法弄清楚如何设置头允许CORS。

经过大量的试验和错误,并阅读guice文档,我发现如何将CORS头添加到离开服务器的响应中。

Guice Servletmodulee类允许您将过滤器添加到您的servlet上下文中。 这使我可以让所有的请求通过一个给定的servlet。

因为我正在尝试构建一个响应CORS请求的其他应用程序,所以我需要一个过滤器,将cors头添加到任何请求的响应中。 现在,它响应所有的请求,但最终我只会响应,如果服务层响应200 – 300响应代码

所以要使用guice在我的嵌入式服务器中启用cors,我建立了一个如下所示的过滤器:

@Singleton public class CorsFilter implements Filter{ @Override public void doFilter(ServletRequest request,ServletResponse response,FilterChain filterChain) throws IOException,servletexception { if(response instanceof HttpServletResponse){ HttpServletResponse alteredResponse = ((HttpServletResponse)response); addCorsHeader(alteredResponse); } filterChain.doFilter(request,response); } private void addCorsHeader(HttpServletResponse response){ //Todo: externalize the Allow-Origin response.addheader("Access-Control-Allow-Origin","*"); response.addheader("Access-Control-Allow-Methods","POST,HEAD"); response.addheader("Access-Control-Allow-Headers","X-PINGOTHER,Origin,X-Requested-With,Content-Type,Accept"); response.addheader("Access-Control-Max-Age","1728000"); } @Override public void destroy() {} @Override public void init(FilterConfig filterConfig)throws servletexception{} }

Guice提供了一个抽象类,允许你配置Guice Servlet。

配置模块如下所示:

public class Restmodulee extends Servletmodulee{ @Override protected void configureServlets() { bind(MyServiceClass.class); // hook Jersey into Guice Servlet bind(GuiceContainer.class); // hook Jackson into Jersey as the POJO <-> JSON mapper bind(JacksonjsonProvider.class).in(Scopes.SINGLetoN); Map<String,String>(); serve("/*").with(GuiceContainer.class,guiceContainerConfig); filter("/*").through(CorsFilter.class); } }

现在,guice将为每个响应添加cors头文件。 允许我的纯HTML 5应用程序与它交谈,不管它在哪里被服务。

只需将一行写入代码文件即可

response.addheader(“Access-Control-Allow-Origin”,“*”);

如果您只允许特定域名,请将您的http://www.yoursite.com替换为*

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐