1. 程式人生 > 其它 >c#圖解教程_第四章_類的基本概念

c#圖解教程_第四章_類的基本概念

什麼是域和跨域。

域:協議 + 域名 + 埠;三者完全相同則為同域,反之有其一不同均為不同域。

跨域請求:當前【發起請求】的域和【請求指向】的域屬於不同域時,該次請求稱之為跨域請求。

跨域問題:

  • 同一域名下允許通訊
  • 同一域名下不同資料夾允許通訊
  • 同一域名不同埠不允許通訊
  • 同一域名不同協議不允許通訊
  • 域名和域名對應IP不允許通訊
  • 主域名相同,子域名不同不允許通訊
  • 同一域名,不同二級域名不允許通訊
  • 不同域名不允許通訊

跨域請求

1、全域性配置

可以通過實現WebMvcConfigurer介面然後重寫addCorsMappings方法解決跨域問題。

// 請求跨域
@Configuration
public
class CorsConfig implements WebMvcConfigurer { static final String ORIGINS[] = new String[] { "GET", "POST", "PUT", "DELETE" }; @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 所有的當前站點的請求地址,都支援跨域訪問。 .allowedOrigins("*") //
所有的外部域都可跨域訪問。 如果是localhost則很難配置,因為在跨域請求的時候,外部域的解析可能是localhost、127.0.0.1、主機名 .allowCredentials(true) // 是否支援跨域使用者憑證 .allowedMethods(ORIGINS) // 當前站點支援的跨域請求型別是什麼 .maxAge(3600); // 超時時長設定為1小時。 時間單位是秒。 } }

2、使用 @CrossOrigin註解

Controller層在需要跨域的類或者方法上加上該註解即可。

@RestController
@RequestMapping(
"/user") @RequiredArgsConstructor @CrossOrigin(origins = "*",maxAge = 3600) public class UserController { final UserService userService; @GetMapping("/getOne/{id}") public User getOne(@PathVariable("id") Integer id) { return userService.getById(id); } }

3、自定義跨域過濾器

1)編寫過濾器

// 跨域過濾器
@Component
public class CORSFilter implements Filter {
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //*號表示對所有請求都允許跨域訪問
        HttpServletResponse res = (HttpServletResponse) response;
        res.addHeader("Access-Control-Allow-Credentials", "true");
        res.addHeader("Access-Control-Allow-Origin", "*");
        res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
        res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN");
        if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) {
            response.getWriter().println("Success");
            return;
        }
        chain.doFilter(request, response);
    }
 
    @Override
    public void destroy() {
 
    }
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
 
    }
}

2)註冊過濾器

@Configuration
public class CorsConfig {
 
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }
 
}