Xmlhttprequest请求跨域

来源:互联网 发布:scarsong知乎 编辑:程序博客网 时间:2024/06/11 02:44


Xmlhttprequest请求跨域

同源策略

本人采用:

一:接口注解@CrossOrigin

二:过滤器对跨域请求特殊处理

HttpServletRequest servletRequest = (HttpServletRequest) request;
HttpServletResponse servletResponse = (HttpServletResponse) response;
String curOrigin = servletRequest.getHeader("Origin");
if (curOrigin != null) {
// 登陆相关不允许跨域
servletResponse.setHeader("Access-Control-Allow-Origin", "*");
servletResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
servletResponse.setHeader("Access-Control-Max-Age", "3600");
servletResponse.setHeader("Access-Control-Allow-Headers", "x-requested-with, Content-Type");
servletResponse.setHeader("Access-Control-Allow-Credentials", "true");



浏览器设置解决

http://www.cnblogs.com/laden666666/p/5544572.html

 

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


第一种

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

@Controller@CrossOriginpublic class GreetingController {

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

@CrossOrigin

    @RequestMapping("/greeting")

    public @ResponseBody Greetinggreeting(@RequestParam(required=false, defaultValue="World") String name) {

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

第二种

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

    @Bean

    public WebMvcConfigurercorsConfigurer() {

        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 >   

@Configuration@EnableWebMvcpublic class WebConfig extends WebMvcConfigurerAdapter {

 

    @Override

    public void addCorsMappings(CorsRegistry registry) {

        registry.addMapping("/**");

    }

· }

您可以轻松地更改任何属性,以及配置适用于特定的路径模式的CORS:

@Configuration@EnableWebMvcpublic class WebConfig extends WebMvcConfigurerAdapter {

 

    @Override

    public void addCorsMappings(CorsRegistry registry) {

        registry.addMapping("/api/**")

            .allowedOrigins("http://domain2.com")

            .allowedMethods("PUT","DELETE")

            .allowedHeaders("header1","header2","header3")

            .exposedHeaders("header1","header2")

            .allowCredentials(false).maxAge(3600);

    }

}

 

阅读全文
0 0
原创粉丝点击