spring mvc 跨域问题。。。解决

本文介绍了解决SpringMVC跨域问题的三种方法:使用@CrossOrigin注解、手动拼接JSONP回调字符串及配置拦截器。并提供了详细的前后端实现代码。
官方推荐方式:

http://spring.io/blog/2015/06/08/cors-support-in-spring-framework

方式1:

    $.ajax({  //前台:常规写法。注意:如果用注解dataType别写成了JSONP 要写成JSON 两都有区别。一个是协议一个是数据格式(个人理解)
                    url:'http://localhost:8082/cors/corsTest.do',
                    data:{},
                    dataType:'json',
                    type:'post',
                    success:function(data){
                        alert(data.abc);
                    }
                })
    // 后台代码 。。。 添加注解即可。CrossOrigin(这里可能配置多个地址。不配置默认全部 可以配置到controller上面。也可以配置方法上。都配置他会自动合并)
   @SuppressWarnings("unchecked")
    @RequestMapping(value="/corsTest",method = RequestMethod.POST)
    @ResponseBody
    @CrossOrigin
    public Object corsTest(){
        Map map = new HashMap();
        map.put("abc", 123);
        return map;
    }     

方式2:

                  $.ajax({ //不采用注解方法,手动拼一个callback字符串。
                    url:'http://localhost:8082/cors/corsTest1.do',
                    data:{},
                    async:false,
                    dataType:'jsonp',
                    jsonpCallback:"callback",
                    type:'post',
                    success:function(data){
                        alert(data.abc);
                    }
                })                

     
     后台代码:
  @RequestMapping(value="/corsTest1")
    @ResponseBody
    public Object corsTest1(){
        Map map = new HashMap();
        map.put("abc", 456);
        return "callback("+JSON.toJSONString(map)+")";
    }

方式3:

即不采用注解也不采用手动拼接字符串的方式 。就是用拦截器方式;

public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        try {
            HttpServletRequest httpRequest = (HttpServletRequest) request;
            HttpServletResponse httpResponse = (HttpServletResponse) response;

            // 跨域
            String origin = httpRequest.getHeader("Origin");
            if (origin == null) {
                httpResponse.addHeader("Access-Control-Allow-Origin", "*");
            } else {
                httpResponse.addHeader("Access-Control-Allow-Origin", origin);
            }
            httpResponse.addHeader("Access-Control-Allow-Headers", "Origin, x-requested-with, Content-Type, Accept,X-Cookie");
            httpResponse.addHeader("Access-Control-Allow-Credentials", "true");
            httpResponse.addHeader("Access-Control-Allow-Methods", "GET,POST,PUT,OPTIONS,DELETE");
            if ( httpRequest.getMethod().equals("OPTIONS") ) {
                httpResponse.setStatus(HttpServletResponse.SC_OK);
                return;
            }
            chain.doFilter(request, response);
        } catch (Exception e) {
            logger.error("Exception in crossFilter", e);
            throw e;
        }
    }
然后在web.xml配置一下就行了。
 <filter>
    <filter-name>crossDemoFilter</filter-name>
    <filter-class>com.shanreal.filter.crossFilter</filter-class>
  </filter>
  
  <filter-mapping>
    <filter-name>crossDemoFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
还有一种就是通过nginx配置。学习中

 

posted on 2018-03-28 15:27 zhouixi 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/1-Admin/p/8664108.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值