Spring 3.1 MVC RESTサポートのクロスドメインアクセス(Cross-orign resource shring)


クロスドメインリソースのアクセスについては、参照してください. http://en.wikipedia.org/wiki/Cross-origin_レスリングsharring ,基本的な原理はSpring Controllerの要求ごとにAccess-Coontrol-headerを加えることです.すべてのブラウザがこれらのheaderをサポートしているわけではないので、使う前に分かります.
実現も簡単です.それは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のように普通の要求と区別します.