我正在使用最新版本的GlassFish。我想在响应中设置Access-Control-Allow-Origin标头,以便可以从任何域调用托管在GlassFish上的API。但我无法找出设置它的位置。GlassFish:如何设置访问控制 - 允许源标头
回答
在我的情况下,API请求完全由泽西处理,因此我可以在ContainerResponseFilter
设置响应头:
<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>
:
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;
}
}
过滤器被在web.xml中启用如果你不使用Jersey,我想你可以创建一个类似的servlet响应过滤器。
这是一个Java EE标准的方式来做到这一点。它与Jersey示例几乎完全相同,只是使用的库包(javax)和获取标头的方法调用不同(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");
}
}
glassfish 4.1中的web.xml如何? – Muka 2015-07-08 01:56:59
由于您使用标签java-ee-6,我相信@Provider不受支持。我用下面的代码的基础上,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);
}
如果条目不在上下文菜单中,请选择“Other ...”,然后通过键入“cross”来过滤选项列表。从现在起,您可以按照莱昂纳多描述的上下文菜单访问它。 – 2017-02-02 15:17:06
这个!!!我不知道为什么这不是更经常提及。像魅力一样工作,只需要1秒 – Rombus 2017-07-13 20:33:19
- 1. 在Java中设置AMP访问控制允许源头标头
- 2. 无法设置'访问控制允许来源'标头
- 3. 设置访问控制允许来源
- 4. 与头问题设置访问控制允许来源
- 5. 否“访问控制允许来源”头
- 6. 访问控制 - 允许来源不允许访问控制 - 允许来源
- 7. 访问 - 控制 - 允许来源不允许访问 - >来源*
- 8. 访问控制 - 允许来源不允许访问源URL
- 9. 没有“访问控制允许来源”标头,AngularJS
- 10. Mandrill XMLHttpRequest错误 - 无效的访问控制 - 允许源标头
- 11. CORS标头“访问控制允许来源” localhost上
- 12. 如何使用springboot允许访问控制允许来源
- 13. 访问控制 - 允许来源不允许访问http:// localhost
- 14. 访问控制 - 允许来源不允许访问原因
- 15. 访问控制允许来源问题
- 16. Apache设置访问控制允许来源http从https到https
- 17. 动态设置访问允许控制源
- 18. Apache多重访问控制允许来源设置
- 19. PHP来源是不允许的访问控制允许来源
- 20. 访问控制 - 允许来源的HTTP DELETE不允许来源
- 21. 访问控制 - 允许来源不允许来源
- 22. IOS9 WKWebView访问控制 - 允许来源
- 23. 访问控制允许源代码405?
- 24. XMLHTTPRequest访问控制 - 允许来源
- 25. 访问控制允许来源htaccess
- 26. Angularjs访问控制允许来源
- 27. 离子,访问控制允许来源
- 28. Ionic - 访问控制 - 允许来源
- 29. ReactJS否'访问控制 - 允许来源'
- 30. 否“访问控制允许来源”
可以添加一个例子如何在没有球衣的情况下做到这一点? – Berty 2012-07-02 14:58:42
http://padcom13.blogspot.de/2011/09/cors-filter-for-java-applications.html – Hank 2012-07-04 09:56:59
那么,对于CXF方法中描述的方法不起作用,因为来自jax-rs 2.0 API的ContainerRequestFilter确实不从Filter过滤器扩展/实现,因此不能配置为servlet过滤器。试图这样做会导致类抛出异常。 – 2013-05-22 20:51:31