SpringBoot跨域的几种解决方案

SpringBoot跨域的几种解决方案SpringBoot跨域请求处理方式方法一、SpringBoot的注解@CrossOrigin(也支持SpringMVC)简单粗暴的方式,Controller层在需要跨域的类或者方法上加上该注解即可@RestController@CrossOrigin@RequestMapping(“/situation”)publicclassSituationControllerextendsPublicUtilController{@AutowiredprivateSit

大家好,又见面了,我是你们的朋友全栈君。

SpringBoot跨域请求处理方式

方法一、SpringBoot的注解@CrossOrigin(也支持SpringMVC)

简单粗暴的方式,Controller层在需要跨域的类或者方法上加上该注解即可

@RestController
@CrossOrigin
@RequestMapping("/situation")
public class SituationController extends PublicUtilController { 
   

    @Autowired
    private SituationService situationService;
    // log日志信息
    private static Logger LOGGER = Logger.getLogger(SituationController.class);
    
}

但每个Controller都得加,太麻烦了,怎么办呢,加在Controller公共父类(PublicUtilController)中,所有Controller继承即可。

@CrossOrigin
public class PublicUtilController { 
   

    /** * 公共分页参数整理接口 * @param currentPage * @param pageSize * @return */
    public PageInfoUtil proccedPageInfo(String currentPage, String pageSize) { 
   

        /* 分页 */
        PageInfoUtil pageInfoUtil = new PageInfoUtil();
        try { 
   
            /* * 将字符串转换成整数,有风险, 字符串为a,转换不成整数 */
            pageInfoUtil.setCurrentPage(Integer.valueOf(currentPage));
            pageInfoUtil.setPageSize(Integer.valueOf(pageSize));
        } catch (NumberFormatException e) { 
   
        }
        return pageInfoUtil;
    }
}

当然,这里虽然指SpringBoot,SpringMVC也是同样的,但要求在Spring4.2及以上的版本。

另外,如果SpringMVC框架版本不方便修改,也可以通过修改tomcat的web.xml配置文件来处理

SpringMVC使用@CrossOrigin使用场景要求

jdk1.8+
Spring4.2+

方法二、处理跨域请求的Configuration

增加一个配置类,CrossOriginConfig.java。继承WebMvcConfigurerAdapter或者实现WebMvcConfigurer接口,其他都不用管,项目启动时,会自动读取配置。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/** * AJAX请求跨域 */
@Configuration
public class CorsConfig extends WebMvcConfigurerAdapter { 
   
    static final String ORIGINS[] = new String[] { 
    "GET", "POST", "PUT", "DELETE" };
    @Override
    public void addCorsMappings(CorsRegistry registry) { 
   
        registry.addMapping("/**").allowedOrigins("*").allowCredentials(true).allowedMethods(ORIGINS).maxAge(3600);
    }

方法三、采用过滤器(filter)的方式

同方法二加配置类,增加一个CORSFilter 类,并实现Filter接口即可,其他都不用管,接口调用时,会过滤跨域的拦截。

@Component
public class CORSFilter implements Filter { 
   

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException { 
   
        HttpServletResponse res = (HttpServletResponse) response;
        // 设置允许Cookie
        res.addHeader("Access-Control-Allow-Credentials", "true");
        // 允许http://www.xxx.com域(自行设置,这里只做示例)发起跨域请求
        res.addHeader("Access-Control-Allow-Origin", "*");
        // 设置允许跨域请求的方法
        res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
        // 允许跨域请求包含content-type
        res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN");
        if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) { 
   
            response.getWriter().println("ok");
            return;
        }
        chain.doFilter(request, response);
    }
    
    @Override
    public void destroy() { 
   
    }
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException { 
   
    }
}

方法四、采用nginx做动态代理

源于:IT老哥

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149342.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月16日 下午9:24
下一篇 2022年6月16日 下午9:24


相关推荐

  • Linux系列——VMware虚拟机配置端口转发(端口映射),实现远程访问[通俗易懂]

    Linux系列——VMware虚拟机配置端口转发(端口映射),实现远程访问[通俗易懂]前言本文所写的远程为各个电脑在同一个网段内本文主要详细介绍如何远程访问虚拟机里面的项目!机器:虚拟机(装在电脑1里)、电脑1(宿主机)、电脑2、电脑3、电脑4、电脑n…操作步骤:step1:打开虚拟机,选择编辑–虚拟网络编辑器step2:选择VMnet8,点击NAT设置,弹出一个设置窗口step3:添加一个端口转发主机端口:随便选取一个宿主机没有被占用……

    2022年8月21日
    10
  • 关于CommandType.StoredProcedure输出参数访问问题

    关于CommandType.StoredProcedure输出参数访问问题MSDN解释:当您将 Command 对象用于存储过程时,可以将 Command 对象的 CommandType 属性设置为 StoredProcedure。当 CommandType 为 StoredProcedure 时,可以使用 Command 的 Parameters 属性来访问输入及输出参数和返回值。无论调用哪一个 Execute 方法,都可以访问 Parameters 属性。但是,

    2022年7月26日
    9
  • Win8.1OS64位oracle11安装配置及PL/SQL Developer怎样连接64位oracle

    Win8.1OS64位oracle11安装配置及PL/SQL Developer怎样连接64位oracle

    2021年12月1日
    43
  • Git配置用户名与邮箱

    Git配置用户名与邮箱1 用户名和邮箱地址的作用用户名和邮箱地址是本地 git 客户端的一个变量每次 commit 都会用用户名和邮箱纪录 github 的 contribution 统计就是按邮箱来统计的 2 查看用户名和邮箱地址 gitconfiguse name gitconfiguse email3 修改用户名和邮箱地址 gitconfigglo name username gitconfigglo email em

    2026年3月17日
    2
  • 基于MATLAB图像处理的中值滤波、均值滤波以及高斯滤波的实现与对比

    基于MATLAB图像处理的中值滤波、均值滤波以及高斯滤波的实现与对比基于 MATLAB 图像处理的中值滤波 均值滤波以及高斯滤波的实现与对比 1 背景知识中值滤波法是一种非线性平滑技术 它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值 中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术 中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替 让周围的像素值接近的真实值 从而消除孤立的噪声点

    2026年3月19日
    1
  • java8中的Collectors.groupingBy用法「建议收藏」

    java8中的Collectors.groupingBy用法「建议收藏」Collectors.groupingBy根据一个或多个属性对集合中的项目进行分组数据准备:publicProduct(Longid,Integernum,BigDecimalprice,Stringname,Stringcategory){ this.id=id; this.num=num; this.price=price; this.name=…

    2022年4月19日
    62

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号