• 后端实现跨域的几种方案


    cros是前后端交互后的产物,解决方案:nginx前端或者后端或者浏览器端解决

    后端控制台也是可以显示日志的,但需要将 logging.logging.root 的日志级别改为debug

    方案一:Filter实现跨域

    手动注入

    在 com.dh.manager.ManagerApplication 中 添加允许跨域方法

    1. @Bean
    2. public FilterRegistrationBean corsFilter() {
    3. UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    4. CorsConfiguration config = new CorsConfiguration();
    5. config.setAllowCredentials(true);
    6. config.addAllowedOrigin("*");
    7. config.addAllowedHeader("*");
    8. config.addAllowedMethod("*");
    9. source.registerCorsConfiguration("/**", config);
    10. FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
    11. bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
    12. return bean;
    13. }

    可选择重写CorsFilter 类

    1. package com.dh.manager.configurer.cros;
    2. import javax.servlet.*;
    3. import javax.servlet.http.HttpServletResponse;
    4. import java.io.IOException;
    5. /**
    6. * @author cl
    7. * @date 2023-04-28 16:42:17
    8. */
    9. public class CorsFilter implements Filter {
    10. @Override
    11. public void init(FilterConfig filterConfig) throws ServletException {
    12. }
    13. @Override
    14. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    15. HttpServletResponse httpResponse = (HttpServletResponse) response;
    16. // 设置允许跨域请求的域名
    17. httpResponse.setHeader("Access-Control-Allow-Origin", "*");
    18. // 设置允许跨域请求的方法
    19. httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
    20. // 设置允许跨域请求的头部信息
    21. httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With, X-File-Name");
    22. chain.doFilter(request, httpResponse);
    23. }
    24. @Override
    25. public void destroy() {
    26. }
    27. }

    自动注入

    注意:如果有多个过滤器的情况,请注意优先级,@Order(Ordered.HIGHEST_PRECEDENCE),同等优先级的情况下,先后顺序不确定(可能是按照名称排序)

    在 com.dh.manager.ManagerApplication 上添加 @ServletComponentScan 注解

    自定义过滤类

    1. package com.dh.manager.configurer.cros;
    2. import org.springframework.core.Ordered;
    3. import org.springframework.core.annotation.Order;
    4. import org.springframework.http.HttpStatus;
    5. import org.springframework.stereotype.Component;
    6. import javax.servlet.*;
    7. import javax.servlet.annotation.WebFilter;
    8. import javax.servlet.http.HttpServletRequest;
    9. import javax.servlet.http.HttpServletResponse;
    10. import java.io.IOException;
    11. /**
    12. * @author cl
    13. * @date 2023-04-28 16:42:17
    14. */
    15. @WebFilter(filterName = "CorsFilter", urlPatterns = "/*")
    16. @Component
    17. // 针对 UnLoginFilter 过滤器提前 return 导致无法走到这里的解决方案(让这个过滤器先走)
    18. @Order(Ordered.HIGHEST_PRECEDENCE)
    19. public class CorsFilter implements Filter {
    20. @Override
    21. public void init(FilterConfig filterConfig) throws ServletException {
    22. System.out.println("com.wmx.servlet.SystemFilter -- 系统启动...");
    23. }
    24. @Override
    25. public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    26. HttpServletRequest request = (HttpServletRequest) req;
    27. System.out.println("com.wmx.servlet.SystemFilter -- 过滤器放行前...." + request.getRequestURL());
    28. HttpServletResponse response = (HttpServletResponse) res;
    29. response.setHeader("Access-Control-Allow-Origin", "*");
    30. response.setHeader("Access-Control-Allow-Methods", "*");
    31. response.setHeader("Access-Control-Max-Age", "3600");
    32. response.setHeader("Access-Control-Allow-Headers", "*");
    33. response.setHeader("Access-Control-Allow-Credentials", "true");
    34. // 项目中含有多个过滤器时使用
    35. if ("OPTIONS".equals(request.getMethod())) {
    36. response.setStatus(HttpStatus.OK.value());
    37. response.getWriter().write("OPTIONS returns OK");
    38. return;
    39. }
    40. chain.doFilter(req, res);
    41. System.out.println("com.wmx.servlet.SystemFilter -- 过滤器返回后...." + request.getRequestURL());
    42. }
    43. @Override
    44. public void destroy() {
    45. System.out.println("com.wmx.servlet.SystemFilter -- 系统关闭...");
    46. }
    47. }

    重写已有过滤器

    1. package com.dh.manager.configurer.cros;
    2. import com.dh.manager.interceptor.UnLoginFilter;
    3. import org.springframework.stereotype.Component;
    4. import javax.servlet.FilterChain;
    5. import javax.servlet.FilterConfig;
    6. import javax.servlet.ServletException;
    7. import javax.servlet.ServletRequest;
    8. import javax.servlet.ServletResponse;
    9. import java.io.IOException;
    10. @Component
    11. public class MyUnLoginFilter extends UnLoginFilter{
    12. @Override
    13. public void init(FilterConfig filterConfig) throws ServletException {
    14. super.init(filterConfig);
    15. }
    16. @Override
    17. public void destroy() {
    18. super.destroy();
    19. }
    20. @Override
    21. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    22. System.out.println("重写成功了");
    23. super.doFilter(request,response,chain);
    24. }
    25. }
  • 相关阅读:
    Java Servlet关键点详解
    运营商大数据怎样对目标客户群体进行精准定位?
    MySQL数据库入门到大牛_05_排序ORDER BY与分页LIMIT
    10 种常用的字符串方法
    SpringMVC-REST风格简介及RESTful入门案例
    鸿蒙系统调研适配
    公共事业管理概论试卷6套含答案(大学期末复习资料)
    Linux:docker搭建redis集群(3主3从&扩容缩容 哈希槽分配)
    可解释人工智能(XAI)
    磁性积木片外贸出口美国站CPC认证标准
  • 原文地址:https://blog.csdn.net/RAXCL/article/details/134012499