Spring项目Ajax请求跨域问题解决

本文详细介绍了浏览器的同源策略及跨域问题,提供了多种解决方法,包括Spring框架下的CORS配置和自定义过滤器实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是跨域

简单的说即为浏览器限制访问A站点下的js代码对B站点下的url进行ajax请求。比如说,前端域名是www.abc.com,那么在当前环境中运行的js代码,出于安全考虑,访问www.xyz.com域名下的资源,是受到限制的。现代浏览器默认都会基于安全原因而阻止跨域的ajax请求,这是现代浏览器中必备的功能。

解决办法:

有根据spring的版本不同有不同的解决办法:

  1. 在spring的4.2版本以后支持CORS(跨域资源共享),只需要在类或者方法上加入@CrossOrigin注解来实现:
    @CrossOrigin(origins = "http://www,xxx.com";, maxAge = 3600) 
    
    @RestController @RequestMapping("/account") 
    
    public class AccountController {
    
        @RequestMapping("/{id}") 
    
        public Account retrieve(@PathVariable Long id) { // ... }
    
        @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    
        public void remove(@PathVariable Long id) { // ... } 
    }
    maxAge 表明在3600秒内,不需要再发送预检验请求,添加@CrossOrigin注解后,不需要在ajax请求上有任何改动即可正常发出请求接收数据。

    在Spring4.2中除了在controller的类或方法上设置外,还可以设置全局配置:
    (1)定义一个继承自WebMvcConfigurerAdapter的类
    public class CorsConfigurerAdapter extends WebMvcConfigurerAdapter{
         @Override 
        public void addCorsMappings(CorsRegistry registry) { 
            registry.addMapping("/api/*").allowedOrigins("*").allowedMethods("GET", "PUT", "DELETE", "POST");  
        } 
    
    }

    (1)将该类注入到容器中
     

    <bean class="com.lemo.web.config.CorsConfigurerAdapter"></bean>

     

  2. 在spring的4.2版本之前,可以通过自定义一个拦截器,给请求加上相应的相应头来处理
     

    @Component
     public class MyCorsFilter implements Filter {
    
       @Override
       public void init(FilterConfig filterConfig) throws ServletException {}
    
       @Override
       public void doFilter(ServletRequest servletRequest, ServletResponse    servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
    
         HttpServletResponse response = (HttpServletResponse) servletResponse;
    
    
         String origin = (String) servletRequest.getRemoteHost()+":"+servletRequest.getRemotePort();
    
    
         response.setHeader("Access-Control-Allow-Origin", "*"); //表明它允许任意连接发起跨域请求,*表示所有网站,可以把*替换为具体的网站
    
    
         response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); //表明它允许GET、POST、OPTIONS、DELETE的外域请求
    
    
         response.setHeader("Access-Control-Max-Age", "3600"); //表明在3600秒内,不需要再发送预检验请求
    
    
         response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization"); //表明它允许跨域请求包含content-type头
    
    
         response.setHeader("Access-Control-Allow-Credentials","true"); //设置跨域ajax请求时是否带cookie的设置
    
    
         filterChain.doFilter(servletRequest, servletResponse);
       }
    
      @Override
      public void destroy() {}
    }

    在web.xml中配置使拦截器生效,配置完后即可生效

    <filter>
    
      <filter-name>cors</filter-name>
    
      <filter-class>com.leimo.filter.myeCORSFilter</filter-class>
    
    </filter>
    
    <filter-mapping>
    
      <filter-name>cors</filter-name>
    
      <url-pattern>/*</url-pattern>
    
    </filter-mapping>

     

     

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值