Spring 3.1 MVC RESTサポートのクロスドメインアクセス(Cross-orign resource shring)
3353 ワード
クロスドメインリソースのアクセスについては、参照してください. http://en.wikipedia.org/wiki/Cross-origin_レスリングsharring ,基本的な原理はSpring Controllerの要求ごとにAccess-Coontrol-headerを加えることです.すべてのブラウザがこれらのheaderをサポートしているわけではないので、使う前に分かります.
実現も簡単です.それはInterceptorです.コードは以下の通りです.
実現も簡単です.それはInterceptorです.コードは以下の通りです.
public class AccessKeyInterceptor extends HandlerInterceptorAdapter {
private static Log log=LogFactory.getLog(AccessKeyInterceptor.class);
@Autowired
private IAccessService accessService;
private String accessKeyParameterName="accessKey";
private List defaultAccessAllowedFrom;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String accessKey=request.getParameter(accessKeyParameterName);
String referer = request.getHeader("Referer");
URL u = new URL(referer);
String host = u.getHost().toLowerCase();
if(accessKey==null){
log.error("====================================ILLEGAL ACCESS: ACCESS_KEY_MISSING!=======================");
}else{
log.debug("====================================ACCESS WITH Access KEY:"+accessKey+"====================");
IAccess access = accessService.getAccess(UserSessionUtils.getUserSession(request), accessKey);
if(access!=null){
defaultAccessAllowedFrom=access.getAccessAllowedFrom();
}else{
log.warn("======================================ACCESS KEY:"+accessKey+" DOES NOT EXIST!=================");
}
}
for(String s : defaultAccessAllowedFrom) {
if(host.matches(s)){
response.setHeader("Access-Control-Allow-Origin", referer);
break;
}
}
response.setHeader("Access-Control-Allow-Headers", "Content-Type");
response.setHeader("Access-Control-Allow-Methods", "GET");
response.setHeader("Allow", "GET");
return true;
}
public List getDefaultAccessAllowedFrom() {
return defaultAccessAllowedFrom;
}
public void setDefaultAccessAllowedFrom(List defaultAccessAllowedFrom) {
this.defaultAccessAllowedFrom = defaultAccessAllowedFrom;
}
public String getAccessKeyParameterName() {
return AccessKeyParameterName;
}
public void setAccessKeyParameterName(String accessKeyParameterName) {
this.AccessKeyParameterName = AccessKeyParameterName;
}
}
において、defaultAccess AllowedFromはSpringのプロファイルであり、主な構成はデフォルトのライセンスアクセスのurlであり、以下の通りである.
(.+\.)?(domain\.com)$
(.+\.)?(192\.168\.0\.10)$
ただしSpringデフォルトのControllerはOPTIONSの要求を処理しないので、web.xmlで開かなければなりません.
application
org.springframework.web.servlet.DispatcherServlet
dispatchOptionsRequest
true
1
application
/
このようにリクエストする時POSTは自動的にOPTTIONSに要請します.許可を得たらドメインを越えてPOSTにアクセスしてください.一般的にOPTTIONSの方法に「Allow:OPTTIONS,GET,POST」というheaderのように普通の要求と区別します.