我正在使用最新版本的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