Corsはドメインをまたぐ問題を解決します。
4226 ワード
リソースが、そのリソース自体が存在するサーバとは異なるドメインまたはポートからリソースを要求すると、リソースは、ドメインをまたぐHTTP要求(下図ソースネットワーク)を開始する。セキュリティの観点から、ブラウザはドメインをまたぐ要求を制限またはブロックすることができます。このようなシーンは非常に多く、同時にドメインをまたぐ多くの解決方法を生み出しています。例えば私はhttp://localhost:8080上のajaxお願いしますhttp://localhost:9090上のサービスは下記の通りです。
使用例
Cors比較jsop
Corsはjsonpと同じ効果を実現できますが、jsonpよりは強いです。http要請はすべてのタイプに対応しています。jsopはget方式の要求だけをサポートしています。上記のコードは正常にajaxドメインを越えた問題を解決しました。
jquery.min.js:4 Failed to load http://localhost:9090/testJsonp?format=json: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access.
本論文はcors(ドメインをまたぐ資源の共有)技術を利用してajaxクロスドメイン問題を解決します。corsは、ターゲットサーバから返されたHeader設定によって、ドメインをまたぐことができるかどうかを制御するものである。その中の重要な一つのパラメータは Access-Coontrol-Allow-Origin(アクセス制御許可源)は、このパラメータで受信可能な要求リソースを指定します。実現上は、ブロックまたはフィルタを使っても良いです。使用例
corsFilter
com.simonsfan.cn.filter.CorsFilter
allowOrigin
http://×××.com ;
allowMethods
GET,POST,PUT,DELETE,OPTIONS
allowCredentials
true
allowHeaders
Content-Type
corsFilter
/*
上記のように、Web.xmlでは、corsによって使用されるいくつかの定数を定義しており、これらの定数は、直接、列挙または普通量以下のCorsFilterクラスに定義されてもよい。allowOrigin: ( + + );
allowMethods:Http (get/post/put/delete/options);
allowCredentials: cookie Http (true/false);
allowHeaders: (Content-Type);
カスタムフィルタCorsFilterクラスpublic class CorsFilter implements Filter {
private String allowOrigin;
private String allowMethods;
private String allowCredentials;
private String allowHeaders;
private String exposeHeaders;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
allowOrigin = filterConfig.getInitParameter("allowOrigin");
allowMethods = filterConfig.getInitParameter("allowMethods");
allowCredentials = filterConfig.getInitParameter("allowCredentials");
allowHeaders = filterConfig.getInitParameter("allowHeaders");
exposeHeaders = filterConfig.getInitParameter("exposeHeaders");
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,
ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
if (!StringUtils.isEmpty(allowOrigin)) {
List allowOriginList = Arrays.asList(allowOrigin.split(","));
if (!CollectionUtils.isEmpty(allowOriginList)) {
String currentOrigin = request.getHeader("Origin");
if (allowOriginList.contains(currentOrigin)) {
response.setHeader("Access-Control-Allow-Origin", currentOrigin);
}
}
}
if (!StringUtils.isEmpty(allowMethods)) {
response.setHeader("Access-Control-Allow-Methods", allowMethods);
}
if (!StringUtils.isEmpty(allowCredentials)) {
response.setHeader("Access-Control-Allow-Credentials", allowCredentials);// cookie http
}
if (!StringUtils.isEmpty(allowHeaders)) {
response.setHeader("Access-Control-Allow-Headers", allowHeaders);
}
if (!StringUtils.isEmpty(exposeHeaders)) {
response.setHeader("Access-Control-Expose-Headers", exposeHeaders);
}
chain.doFilter(request, response);
}
}
注意:上記のコードは、被呼加入者のサービスに記載されています。Cors比較jsop
Corsはjsonpと同じ効果を実現できますが、jsonpよりは強いです。http要請はすべてのタイプに対応しています。jsopはget方式の要求だけをサポートしています。上記のコードは正常にajaxドメインを越えた問題を解決しました。