LoginSignup
4
4

More than 1 year has passed since last update.

SpringBootでAPI提供する時のCORS接続エラーを解決する

Last updated at Posted at 2022-01-09

経緯

Vue.js と SpringBoot を用いて SPA 開発をしていたところ、API が叩けない問題が発生しました。

Postman 等のツールで API を確認すると Spring は正常に機能しているのに、いざ Vue や React から API を叩こうとするとエラーが出てしまう状況でした。

そこでフロントとバックエンドの接続から、値の受け渡しができるまでを記述していこうと思います。

結論

結局の所、SpringBoot 側の問題でした。

具体的には、他のプログラムからは接続できないようにセキュリティがかかっているとのこと。

そこで今回は、指定した URL からは API を叩けるように指定していく。

Docker コンテナ間でも接続確認できました。

SpringBoot の記述

今回は、

  1. Vue から { email: ○○, password: ☓☓ } を送信し、Spring で受信内容を出力

  2. Spring から { result: OK } を返却する

ディレクトリ構成

app
├src/main/java/com/example
|                   ├ controller - SampleController.java
|                   ├ form       - LoginForm.java
|                   └ common     - CorsConfig.java
└ build ...

SampleController.java

SampleController.java
package com.example.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.form.LoginForm;

@RestController
@RequestMapping("/user")
public class SampleController {

    @PostMapping("/login")
    public Map<String, String> login(@RequestBody LoginForm form) {
        System.out.println(form);
        Map<String, String> sample = new HashMap<>();
        sample.put("result", "OK");
        return sample;
    }

}

CorsConfig.java

CorsConfig.java
package com.example.common;

import java.util.Arrays;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedOrigins(Arrays.asList("http://localhost:8081")); // アクセス許可するURL
        config.setAllowCredentials(true);
        config.addAllowedMethod("*");
        config.addAllowedHeader("*");
        config.addExposedHeader("Set-Cookie");

        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);

        return new CorsFilter(configSource);
    }

}

起動してみる

spring_pic.png
vue_pic.png

Vue - SpringBoot 間で値の受け渡しができました。

最後に

今回はローカル環境上で CORS エラーを解決できましたが、Docker を使ったコンテナ間でのやり取りはまだ CORS エラーが出たままとなっているので、次は Docker 環境上でも機能する仕様にしていきたいと思います。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4