Spring Boot实现跨域

本文介绍了一种跨域拦截器的实现方式,通过创建CrossOriginFilter类并重写doFilter方法,设置响应头来实现跨域请求的支持。该拦截器还记录了请求处理的时间,并对特定的请求方法进行了特殊处理。
部署运行你感兴趣的模型镜像

跨域拦截器:CrossOriginFilter.java

package com.dirk.demo.controller.filter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;

/**
 * @Author: Dirk
 * @Description: 跨域拦截器
 * @Date: Created at 13:39 2018/4/14
 */

public class CrossOriginFilter implements Filter {

    private String allowOrigin;

    private static final Logger logger = LoggerFactory.getLogger(CrossOriginFilter.class);
    public static final NumberFormat FORMAT = new DecimalFormat("0.000");

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        allowOrigin = filterConfig.getInitParameter("allowOrigin");
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        long begin = System.currentTimeMillis();

        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", allowOrigin);
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
        if ("OPTIONS".equals(((HttpServletRequest) req).getMethod())) {
            logger.warn("options method");
            response.sendError(202, "options method");
            return;
        }
        chain.doFilter(req, res);


        if (logger.isInfoEnabled()) {
            long end = System.currentTimeMillis();
            BigDecimal processed = new BigDecimal(end - begin).divide(new BigDecimal(1000));
            String uri = ((HttpServletRequest) req).getRequestURI();
            //login.do 作为负载均衡健康检查的url,打印日志的话,日志量会很大
            if (!uri.equals("/login.do")) {
                logger.info("Processed in {} second(s). URI={}", FORMAT.format(processed), uri);
            }
        }
    }

    @Override
    public void destroy() {

    }
}

注册

package com.dirk.doorlock;

import com.dirk.doorlock.controller.filter.CrossOriginFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class DoorlockApplication {

    public static void main(String[] args) {
        SpringApplication.run(DoorlockApplication.class, args);
    }

    @Bean
    public FilterRegistrationBean crossOriginFilterRegistration() {

        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new CrossOriginFilter());
        registration.addUrlPatterns("*");
        registration.addInitParameter("allowOrigin", "*");
        registration.setName("CrossOriginFilter");
        registration.setOrder(1);
        return registration;
    }

}


您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

<think>好的,我现在需要回答用户关于如何在SpringBoot实现配置的问题。首先,我得回忆一下SpringBoot处理的各种方法。根据用户提供的引用内容,有三个主要的实现方式:通过配置文件设置全局CORS、使用WebMvcConfigurer接口进行全局配置,以及使用@CrossOrigin注解进行局部配置。首先,全局配置有两种方式,一种是使用application.properties或application.yml,这在引用2中提到过。用户可以直接在配置文件中设置允许的源、方法、头信息等。这种方式比较简单,适合快速配置,但可能需要重启应用才能生效。 第二种全局配置是通过实现WebMvcConfigurer接口,并重写addCorsMappings方法,如引用3中的示例代码所示。这种方法更灵活,可以在代码中定义更复杂的规则,比如不同的路径有不同的配置。需要注意的是,allowedOrigins不能同时使用通配符*和具体名,否则会报错,所以用户需要根据情况选择。第三种是使用@CrossOrigin注解在控制器或方法上,这种方式适合针对特定的API进行配置,灵活性更高,但如果有多个控制器需要配置,可能会显得繁琐。 接下来,我需要确保回答结构清晰,分点说明每种方法,并给出示例代码或配置片段。同时,用户可能关心这些方法之间的区别和适用场景,比如全局配置适合统一规则,而注解适合特定需求。此外,安全性也是一个要点,比如使用通配符*可能存在风险,应该在生产环境中限制具体的名。然后,用户的问题中还提到生成相关问题,我需要根据内容提出几个相关的问题,比如性能优化、安全性考虑或具体配置细节。这些问题应该能够帮助用户进一步深入理解配置的不同方面。最后,检查是否符合之前的系统级指令,比如数学公式是否正确(虽然这里可能用不上),使用中文回答,引用标识是否正确添加。确保每个引用只在末尾出现一次,并且与内容自然衔接。例如,在提到配置文件方法时,引用2;在代码示例时,引用3;在提到灵活性和性能时,引用1。现在整理这些思路,形成结构化的回答,分点说明每种方法,给出示例,并附上相关问题。</think>在Spring Boot实现配置主要有三种常用方式,可根据需求选择全局或局部配置: ### 一、通过配置文件全局配置(推荐基础项目) 在`application.properties`或`application.yml`中设置: ```properties # 允许携带凭证(如cookies) spring.web.cors.allow-credentials=true # 允许的源地址(生产环境建议替换为具体名) spring.web.cors.allowed-origins=http://localhost:3000 # 允许的HTTP方法 spring.web.cors.allowed-methods=GET,POST,PUT,DELETE # 允许的请求头 spring.web.cors.allowed-headers=* ``` 此方式适合快速统一配置,修改后需重启应用[^2]。 ### 二、通过WebMvcConfigurer全局配置(推荐企业级项目) 创建配置类实现更灵活的规则: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") // 仅对/api路径生效 .allowedOrigins("https://mijiupro.com") .allowedMethods("*") .maxAge(3600); // 预检请求缓存时间 } } ``` 此方式支持路径级粒度控制,且可配置OPTIONS预检缓存提升性能[^3]。 ### 三、使用@CrossOrigin注解局部配置 在控制器类或方法上添加注解: ```java @RestController @CrossOrigin(origins = "https://client-domain.com", methods = RequestMethod.POST) public class OrderController { @PostMapping("/create") public ResponseEntity<?> createOrder() { //... } } ``` 适合为特定接口定制策略,优先级高于全局配置[^1]。 ### 安全建议 1. 生产环境应避免使用`allowedOrigins("*")` 2. 敏感接口建议结合`allowCredentials`与具体白名单 3. 复杂场景可组合使用全局配置与注解覆盖
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值