上一篇9.SpirngBoot用户登录拦截器刚刚说过应用拦截器对用户登录状态进行拦挡,本文就顺便说说应用拦截器解决跨域问题吧。
咱们本系列应该不会遇到跨域问题,但日常工作中,一个新我的项目和前端小伙伴联调时还是要解决跨域问题的,本文就一起简略的看一下,当前遇到了跨域问题也能够疾速解决。
什么是跨域
CORS全称Cross-Origin Resource Sharing,意为跨域资源共享。当一个资源去拜访另一个不同域名或者同域名不同端口的资源时,就会收回跨域申请。如果此时另一个资源不容许其进行跨域资源拜访,那么拜访就会遇到跨域问题。
跨域指的是因为浏览器的安全性限度,不容许前端页面拜访协定不同、域名不同、端口号不同的http接口,例如我本地创立一个html,外面写一个ajax申请拜访我服务器SpringBoot利用提供的接口:192.168.1.11:8080/getUser
则会出报 No 'Access-Control-Allow-Origin' header is present on the requested resource.
谬误。
SpringBoot怎么解决跨域
在springboot中能够采纳多种形式解决跨域问题,例如:能够在类或办法上增加@CrossOrigin
注解。还有一种就是全局配置,全局配置须要增加自定义类实现WebMvcConfigurer
接口,而后实现接口中的addCorsMappings
办法。
- addMapping:示意对哪种格局的申请门路进行跨域解决。
- allowedHeaders:示意容许的申请头,默认容许所有的申请头信息。
- allowedMethods:示意容许的申请办法,默认是 GET、POST 和 HEAD。这里配置为 * 示意反对所有的申请办法。
- maxAge:示意探测申请的有效期
- allowedOrigins 示意反对的域
具体代码如下
package com.maple.demo.filter;import org.springframework.core.annotation.Order;import org.springframework.http.HttpHeaders;import javax.servlet.*;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/** * 跨域拦挡. * * @author 笑小枫 * @date 2022-07-21 19:23:08 * @since JDK 1.8 */@WebFilter(filterName = "corsFilter", urlPatterns = "/*")@Order(0)public class CorsFilter implements Filter { private static final String HEADER_ORIGIN = "Origin"; private static final String METHOD_OPTIONS = "OPTIONS"; @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { final HttpServletRequest request = (HttpServletRequest) req; final HttpServletResponse response = (HttpServletResponse) res; if (request.getHeader(HEADER_ORIGIN) != null) { response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, request.getHeader(HEADER_ORIGIN)); } response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"); // 如果容许所有申请形式,用* response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET, POST, PUT, DELETE, OPTIONS"); response.setHeader(HttpHeaders.ACCESS_CONTROL_MAX_AGE÷, "3600"); // 如果容许所有header,用* response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "Authorization, Content-Type, Accept, X-Requested-With, remember-me"); response.setHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "Content-Disposition"); if (METHOD_OPTIONS.equalsIgnoreCase(request.getMethod())) { response.setStatus(HttpServletResponse.SC_OK); return; } chain.doFilter(req, res); }}
对于笑小枫
本章到这里完结了,喜爱的敌人关注一下我呦
微信公众号:笑小枫
笑小枫集体博客:https://www.xiaoxiaofeng.com
本文源码:https://github.com/hack-feng/maple-demo