服务端解决跨域问题的方案(一)

转自: http://blog.csdn.net/james_wade63/article/details/50772041

跨域是指html文件所在的服务器与ajax请求的服务器是不同的ip+port,例如:
- ‘192.168.1.1:8080’ 与 ‘192.168.1.2:8080’是不同的域。
- ‘192.168.1.1:8080’ 与 ‘192.168.1.1:8081’是不同的域。

解决此类问题的方法很多,有需要客户端和服务端都要更改的,例如jsonp,iframe等等;有只需要客户端更改的,这种情况只能出现在hybrid app开发中,即通过调用native方法来进行网络请求;有只需要服务端配置的,下面介绍3种服务端配置的方法。

第一种

如果您使用的mvc框架是spring4.2以上的话,一个@CrossOrigin就可以搞定。将@CrossOrigin加到Controller上,那么这个Controller所有的请求都是支持跨域的,代码如下:

@Controller
@CrossOrigin
public class GreetingController {
    
    

    将@CrossOrigin加到请求方法上,那么这个请求是支持跨域的,代码如下

    @CrossOrigin
        @RequestMapping("/greeting")
        public @ResponseBody Greeting greeting(@RequestParam(required=false, defaultValue="World") String name) {
        
        
    • 1
    • 2
    • 3

    更详细的@CrossOrigin介绍,请参看这里

    第二种

    全局配置,也需要spring4.2以上。

        @Bean
        public WebMvcConfigurer corsConfigurer() {
            return new WebMvcConfigurerAdapter() {
                @Override
                public void addCorsMappings(CorsRegistry registry) {
                    registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:9000");
                }
            };
        }

    .addCorsMappings()中的参数代表支持跨域的url,.allowedOrigins()中的参数代表可以访问该接口的域名,设置为”*”可支持所有域。

    第三种

    这种方法就跟框架无关了,需要两个jar包,点击这里进行下载,两个jar包可以放的程序里,也可以放到tomcat中,然后将下面的配置写到web.xml中就可以了

    < filter >   
    
         < filter-name > CORS </ filter-name >   
    
         < filter-class > com.thetransactioncompany.cors.CORSFilter </ filter-class >   
    
        < init-param >   
    
                                     < param-name > cors.allowOrigin </ param-name >   <!--配置授信的白名单的域名!-->
    
             < param-value > * </ param-value >   
    
         </ init-param >   
    
         < init-param >   
    
          < param-name > cors.supportedMethods </ param-name >   
    
             < param-value > GET, POST, HEAD, PUT, DELETE </ param-value >   
    
         </ init-param >   
    
         < init-param >   
    
          < param-name > cors.supportedHeaders </ param-name >   
    
             < param-value > Accept, Origin, X-Requested-With, Content-Type, Last-Modified </ param-value >   
    
         </ init-param >   
    
         < init-param >   
    
             < param-name > cors.exposedHeaders </ param-name >   
    
             < param-value > Set-Cookie </ param-value >   
    
         </ init-param >   
    
         < init-param >   
    
             < param-name > cors.supportsCredentials </ param-name >   
    
             < param-value > true </ param-value >   
    
         </ init-param >   
    
    </ filter >   
    
    < filter-mapping >   
    
         < filter-name > CORS </ filter-name >   
    
         < url-pattern > /* </ url-pattern >   
    
    </ filter-mapping >   

    跨域是指html文件所在的服务器与ajax请求的服务器是不同的ip+port,例如:
    - ‘192.168.1.1:8080’ 与 ‘192.168.1.2:8080’是不同的域。
    - ‘192.168.1.1:8080’ 与 ‘192.168.1.1:8081’是不同的域。

    解决此类问题的方法很多,有需要客户端和服务端都要更改的,例如jsonp,iframe等等;有只需要客户端更改的,这种情况只能出现在hybrid app开发中,即通过调用native方法来进行网络请求;有只需要服务端配置的,下面介绍3种服务端配置的方法。

    第一种

    如果您使用的mvc框架是spring4.2以上的话,一个@CrossOrigin就可以搞定。将@CrossOrigin加到Controller上,那么这个Controller所有的请求都是支持跨域的,代码如下:

    @Controller
    @CrossOrigin
    public class GreetingController {
      
      

      将@CrossOrigin加到请求方法上,那么这个请求是支持跨域的,代码如下

      @CrossOrigin
          @RequestMapping("/greeting")
          public @ResponseBody Greeting greeting(@RequestParam(required=false, defaultValue="World") String name) {
        
        
      • 1
      • 2
      • 3

      更详细的@CrossOrigin介绍,请参看这里

      第二种

      全局配置,也需要spring4.2以上。

          @Bean
          public WebMvcConfigurer corsConfigurer() {
              return new WebMvcConfigurerAdapter() {
                  @Override
                  public void addCorsMappings(CorsRegistry registry) {
                      registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:9000");
                  }
              };
          }

      .addCorsMappings()中的参数代表支持跨域的url,.allowedOrigins()中的参数代表可以访问该接口的域名,设置为”*”可支持所有域。

      第三种

      这种方法就跟框架无关了,需要两个jar包,点击这里进行下载,两个jar包可以放的程序里,也可以放到tomcat中,然后将下面的配置写到web.xml中就可以了

      < filter >   
      
           < filter-name > CORS </ filter-name >   
      
           < filter-class > com.thetransactioncompany.cors.CORSFilter </ filter-class >   
      
          < init-param >   
      
                                       < param-name > cors.allowOrigin </ param-name >   <!--配置授信的白名单的域名!-->
      
               < param-value > * </ param-value >   
      
           </ init-param >   
      
           < init-param >   
      
            < param-name > cors.supportedMethods </ param-name >   
      
               < param-value > GET, POST, HEAD, PUT, DELETE </ param-value >   
      
           </ init-param >   
      
           < init-param >   
      
            < param-name > cors.supportedHeaders </ param-name >   
      
               < param-value > Accept, Origin, X-Requested-With, Content-Type, Last-Modified </ param-value >   
      
           </ init-param >   
      
           < init-param >   
      
               < param-name > cors.exposedHeaders </ param-name >   
      
               < param-value > Set-Cookie </ param-value >   
      
           </ init-param >   
      
           < init-param >   
      
               < param-name > cors.supportsCredentials </ param-name >   
      
               < param-value > true </ param-value >   
      
           </ init-param >   
      
      </ filter >   
      
      < filter-mapping >   
      
           < filter-name > CORS </ filter-name >   
      
           < url-pattern > /* </ url-pattern >   
      
      </ filter-mapping >   

      猜你喜欢

      转载自blog.csdn.net/luoliang2012/article/details/78274064
      今日推荐