Spring Boot 2.x (9): не паникуйте, когда сталкиваетесь с междоменными

Spring Boot

что такое кросс домен

Во-первых, нам нужно понять, как составляется URL:

// протокол + имя домена (субдомен + имя основного домена) + номер порта + адрес ресурса http: + // + www.baidu.com +: 8080/

если толькоПротокол, поддомен, основной домен, номер портаЕсли один из этих четырех компонентов отличается, его можно рассматривать как другой домен, а когда разные домены получают доступ к ресурсам друг от друга, это называется междоменным.

С ростом популярности раздельной разработки front-end и back-end мы часто сталкиваемся с междоменными проблемами, и когда мы видим такие ошибки в браузере, мы должны осознавать, что столкнулись с междоменными:

Несколько решений для междоменных решений

Во-первых, мы используемvue-cliчтобы быстро построить интерфейсный проект, а затем использоватьaxiosотправить запрос ajax в фоновом режиме. Затем распечатайте информацию о возврате в консоли. Я не буду здесь вдаваться в подробности, позже я напишу отдельную статью о том, как использовать vue-cli для быстрого создания vue-проекта.

Я не буду объяснять использование здесьjsonpспособ разрешения междоменного, потому чтоjsonpпуть только черезgetметод запроса для передачи параметров, и есть некоторые неудобства.

Следующие методы решаются с помощью **Технологии доступа между источниками CORS (совместное использование ресурсов между источниками)**. Мы не занимаемся углубленным изучением конкретных принципов реализации. Целью этого класса является решение междоменных проблем~

Способ 1: аннотация

Предоставляет нам аннотацию в Spring Boot@CrossOriginДля достижения междоменного доступа эта аннотация может обеспечить мелкозернистый междоменный контроль на уровне метода. Мы можем добавить эту аннотацию к классу или группе. Если эта аннотация добавлена ​​к классу, все интерфейсы в классе могут быть доступны через домены. Если аннотация добавлена ​​к методу, можно получить доступ только к аннотированному методу.

@RestController
@RequestMapping("/user")
@CrossOrigin
public class UserController {
   @Autowired
    private UserService userService;

   @RequestMapping("/findAll")
    public Object findAll(){
        return userService.list();
    }
}

А теперь еще раз протестируйте:

Бинго, удачи!

Способ 2: реализовать WebMvcConfigurer

Здесь можно добитьсяWebMvcConfigurerв интерфейсеaddCorsMappings()метод для достижения междоменного.

@Configuration
class CORSConfiguration implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}

Давайте закомментируем аннотацию, которую мы только что добавили, чтобы увидеть, можем ли мы получить доступ к этому интерфейсу:

Как и ожидалось, это все еще возможно ~

Способ 3: Фильтр

Мы можем решить междоменную проблему, реализовав интерфейс Fiter и добавив несколько заголовков в запрос:

@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("ok");
            return;
        }
        chain.doFilter(request, response);
    }
    @Override
    public void destroy() {
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
}

Если ничего другого, вы также сможете получить информацию о возврате на консоли.

Конфигурация Nginx решает междоменные проблемы

Если мы используем Nginx в проекте, мы можем добавить следующую конфигурацию в Nginx для решения кросс-доменности (принцип фактически похож на Filter, но работа остается за эксплуатацией и обслуживанием 🤔)

location / {
   add_header Access-Control-Allow-Origin *;
   add_header Access-Control-Allow-Headers X-Requested-With;
   add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;

   if ($request_method = 'OPTIONS') {
     return 204;
   }
}

Исходная статья скудна и неглубока. Если что-то не так, дайте мне знать!


публика

Ваша рекомендация - моя самая большая поддержка!