解决跨域 415问题

public void doFilter(ServletRequest req, ServletResponse resp,
        FilterChain chain) throws IOException, ServletException {
 
    try {
 
        HttpServletRequest hreq = (HttpServletRequest) req;
 
 
 
        HttpServletResponse hresp = (HttpServletResponse) resp;
 
        //跨域
        hresp.setHeader("Access-Control-Allow-Origin", "*");
 
 
        //跨域 Header
 
        hresp.setHeader("Access-Control-Allow-Methods", "*");
 
        hresp.setHeader("Access-Control-Allow-Headers", "Content-Type,XFILENAME,XFILECATEGORY,XFILESIZE");
 
        
 
        // 浏览器是会先发一次options请求,如果请求通过,则继续发送正式的post请求
 
        // 配置options的请求返回
 
        if (hreq.getMethod().equals("OPTIONS")) {
 
            hresp.setStatus(HttpStatus.SC_OK);
 
            // hresp.setContentLength(0);
 
            hresp.getWriter().write("OPTIONS returns OK");
 
            return;
 
        }
 
        // Filter 只是链式处理,请求依然转发到目的地址。
 
        chain.doFilter(req, resp);
 
    } catch (Exception e) {
 
        e.printStackTrace();
 
    }
 
}
 

HTTP 415 Unsupported Media Type 是一种服务器端错误,表示服务器无法处理请求中提供的媒体类型(MIME 类型)。这个错误通常出现在客户端发送了一个服务器不支持的 `Content-Type` 请求头,或者服务器没有配置好来处理特定的媒体类型。HTTP 415 错误常见于 RESTful API 请求,特别是在前后端分离的项目中。 ### 常见原因 1. **请求头中的 `Content-Type` 不被服务器支持** 服务器可能没有配置来处理特定的 `Content-Type`,例如前端发送的是 `application/json`,但后端期望的是 `application/x-www-form-urlencoded`。 2. **后端未正确解析请求体** 在某些框架中,例如 Spring Boot 或 ASP.NET Core,如果请求体格式与后端预期的不匹配,可能会导致解析失败,从而返回 415 错误。 3. **请求(CORS)中的预检请求(OPTIONS)未正确处理** 当请求发送时,浏览器会先发送一个 `OPTIONS` 请求来检查服务器是否允许该请求类型和 `Content-Type`。如果服务器没有正确响应 `OPTIONS` 请求,可能导致后续请求失败。 4. **缺少必要的配置或依赖** 某些框架(如 Spring Boot 或 ASP.NET Core)需要额外的依赖或配置来支持特定的媒体类型(如 JSON 或 XML)。 --- ### 解决方法 #### 1. **确保 `Content-Type` 与后端匹配** 前端发送请求时,应确保 `Content-Type` 与后端期望的一致。例如,如果后端使用 `@RequestBody` 来接收 JSON 数据,则请求头中应包含 `Content-Type: application/json`;如果后端使用 `@FromForm` 接收表单数据,则应使用 `Content-Type: application/x-www-form-urlencoded`。 示例代码(前端使用 `application/json`): ```javascript $.ajax({ url: "/api/example", type: "POST", data: JSON.stringify({ key: "value" }), contentType: "application/json", success: function(response) { console.log(response); } }); ``` #### 2. **检查后端数据绑定配置** 在 Spring Boot 中,如果使用 `@RequestBody` 接收 JSON 数据,需要确保类路径中包含 Jackson 库,并且没有配置错误。在 ASP.NET Core 中,如果使用 `[FromBody]` 接收 JSON 数据,需要确保模型绑定器配置正确。 示例代码(Spring Boot 控制器): ```java @PostMapping("/example") public ResponseEntity<?> example(@RequestBody ExampleDto dto) { return ResponseEntity.ok(dto); } ``` #### 3. **处理请求中的 OPTIONS 预检** 如果请求涉及,服务器需要正确响应 `OPTIONS` 请求。在 Spring Boot 中,可以通过 `@CrossOrigin` 注解或全局 CORS 配置来启用支持;在 ASP.NET Core 中,可以通过 `UseCors` 方法配置策略。 示例代码(Spring Boot 启用): ```java @CrossOrigin(origins = "http://localhost:3000") @PostMapping("/example") public ResponseEntity<?> example(@RequestBody ExampleDto dto) { return ResponseEntity.ok(dto); } ``` #### 4. **添加必要的依赖和配置** 确保项目中包含处理 JSON 或其他媒体类型的必要依赖。例如,在 Spring Boot 项目中,添加 `spring-web` 和 `jackson-databind` 依赖可以启用 JSON 支持。在 ASP.NET Core 中,确保 `Microsoft.AspNetCore.Mvc.Formatters.Json` 包已安装。 示例依赖(Maven 中的 Jackson): ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.3</version> </dependency> ``` #### 5. **检查反向代理或负载均衡器配置** 如果请求经过反向代理(如 Nginx 或 Apache)或负载均衡器,确保它们不会修改或移除 `Content-Type` 请求头。某些反向代理可能会默认移除某些头信息,导致服务器无法正确解析请求。 --- ### 常见场景分析 - **场景 1:前端使用 `JSON.stringify` 发送 JSON 数据,但后端期望表单数据** 在这种情况下,应修改前端代码,将数据转换为 URL 编码格式,并设置 `Content-Type: application/x-www-form-urlencoded`。 - **场景 2:后端使用 `@RequestBody` 但未正确配置 JSON 支持** 需要检查依赖管理工具(如 Maven 或 Gradle)是否引入了 JSON 处理库(如 Jackson),并确保 Spring Boot 的自动配置未被覆盖。 - **场景 3:请求未正确处理 OPTIONS 预检** 需要确保服务器正确响应 `OPTIONS` 请求,并在响应头中包含 `Access-Control-Allow-Origin`、`Access-Control-Allow-Methods` 和 `Access-Control-Allow-Headers`。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值