打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Spring 3.1 MVC REST 支持之跨域访问(Cross

关于跨域资源访问请参考 http://en.wikipedia.org/wiki/Cross-origin_resource_sharing ,基本原理是在Spring Controller的每一个请求返回的时候都加上Access-Control-...header,需要注意的是并不是所有的浏览器都支持这些header,使用之前要先了解清楚。

实现起来也很简单那就是Interceptor,代码如下:

  1. public class AccessKeyInterceptor extends HandlerInterceptorAdapter {  
  2.   
  3.     private static Log log=LogFactory.getLog(AccessKeyInterceptor.class);  
  4.       
  5.     @Autowired  
  6.     private IAccessService accessService;  
  7.       
  8.     private String accessKeyParameterName="accessKey";  
  9.     private List<String> defaultAccessAllowedFrom;  
  10.       
  11.     @Override  
  12.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  
  13.         String accessKey=request.getParameter(accessKeyParameterName);  
  14.         String referer = request.getHeader("Referer");  
  15.         URL u = new URL(referer);  
  16.         String host = u.getHost().toLowerCase();  
  17.         if(accessKey==null){  
  18.             log.error("====================================ILLEGAL ACCESS: ACCESS_KEY_MISSING!=======================");  
  19.         }else{  
  20.             log.debug("====================================ACCESS WITH Access KEY:"+accessKey+"====================");  
  21.             IAccess access = accessService.getAccess(UserSessionUtils.getUserSession(request), accessKey);  
  22.             if(access!=null){  
  23.                 defaultAccessAllowedFrom=access.getAccessAllowedFrom();  
  24.             }else{  
  25.                 log.warn("======================================ACCESS KEY:"+accessKey+" DOES NOT EXIST!=================");      
  26.             }  
  27.         }  
  28.         for(String s : defaultAccessAllowedFrom) {  
  29.             if(host.matches(s)){                              
  30.                 response.setHeader("Access-Control-Allow-Origin", referer);  
  31.                 break;  
  32.             }  
  33.         }  
  34.         response.setHeader("Access-Control-Allow-Headers", "Content-Type");  
  35.         response.setHeader("Access-Control-Allow-Methods", "GET");  
  36.         response.setHeader("Allow", "GET");  
  37.         return true;  
  38.     }  
  39.       
  40.     public List<String> getDefaultAccessAllowedFrom() {  
  41.         return defaultAccessAllowedFrom;  
  42.     }  
  43.   
  44.     public void setDefaultAccessAllowedFrom(List<String> defaultAccessAllowedFrom) {  
  45.         this.defaultAccessAllowedFrom = defaultAccessAllowedFrom;  
  46.     }  
  47.   
  48.     public String getAccessKeyParameterName() {  
  49.         return AccessKeyParameterName;  
  50.     }  
  51.   
  52.     public void setAccessKeyParameterName(String accessKeyParameterName) {  
  53.         this.AccessKeyParameterName = AccessKeyParameterName;  
  54.     }  
  55. }  
其中defaultAccessAllowedFrom是在Spring的配置文件中,主要的配置默认授权访问的url,如下:

  1. <property name="defaultAccessAllowedFrom">  
  2.     <list>  
  3.         <value>(.+\.)?(domain\.com)$</value>  
  4.         <value>(.+\.)?(192\.168\.0\.10)$</value>  
  5.     </list>  
  6. </property>  

但是由于Spring默认Controller是不处理OPTIONS的请求的,所以必须在web.xml中打开,如下:

  1. <servlet>    
  2.    <servlet-name>application</servlet-name>    
  3.    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  4.    <init-param>  
  5.         <param-name>dispatchOptionsRequest</param-name>  
  6.         <param-value>true</param-value>  
  7.    </init-param>    
  8.    <load-on-startup>1</load-on-startup>    
  9. </servlet>    
  10. <servlet-mapping>    
  11.    <servlet-name>application</servlet-name>    
  12.    <url-pattern>/</url-pattern>   
  13. </servlet-mapping>    

这样当请求时POST的时候前段就会自动先请求OPTIONS,得到许可后就可以跨域访问POST请求了。一般我们会在OPTIONS的方法中加上"Allow: OPTIONS,GET,POST"类似header以区分于普通的请求。


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
详解HTTP请求与响应基础及实例
Spring+DWR 全注解版
在集成Spring Axis 的环境下webservice的发布和部署 - Aflye...
Spring HTTP Invoker例子
Spring 注解学习手札
Integrating Apache Axis with the Spring Framework
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服