在springboot邮件API中启用CORS

时间:2019-05-23 22:35:16

标签: reactjs spring-boot nginx

我可以轻松地发送springboot API和reactjs应用进行邮件提取。 托管在nginx服务器中。 React应用程序在本地主机上运行良好,通过电子邮件发送所有okei信息,但是如果我在服务器上运行,则会出现错误。

我尝试添加不同的Nginx服务器设置并添加springboot @CrossOrigin(origins =“ http://xx.xxx.xxx.xxx/”),但到目前为止没有找到任何帮助。 如果我部署到服务器,必须在哪里允许CORS?

Nginx服务器默认值:

server {
   listen 80 default_server;
   root /var/www/name/build;
   server_name xx.xxx.xxx.xxx;
   index index.html index.htm;
   location /  {
    }
}

Springboot:

@PostMapping
    public void sendFeedback(@RequestBody Feedback feedback,
                             BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            throw new ValidationException("Feedback is not valid");
        }

        // Create a mail sender
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        Properties props = mailSender.getJavaMailProperties();
        mailSender.setHost(this.emailCfg.getHost());
        mailSender.setPort(this.emailCfg.getPort());
        mailSender.setUsername(this.emailCfg.getUsername());
        mailSender.setPassword(this.emailCfg.getPassword());

        // Create an email instance
        SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setFrom(feedback.getEmail());
        mailMessage.setTo("test@gmail.com");
        mailMessage.setSubject("Testing mail");
        mailMessage.setText(feedback.getFeedback());
        mailSender.send(mailMessage);
    }

我有Reactjs代码:

fetch(url,{
    method: 'POST',
    headers:{
        'Content-Type': 'application/json'
    },
    body: JSON.stringify(state)
}).then(response =>{
    console.log(data)
}).catch(error =>{
    console.log(error)
})

输出:

Access to fetch at 'http://xx.xxx.xxx.xxx:8080/feedback-0.0.1-SNAPSHOT' from 
origin 'http://xx.xxx.xxx.xxx' has been blocked by CORS policy: 
Response to preflight request doesn't pass access control check: 
Redirect is not allowed for a preflight request.

2 个答案:

答案 0 :(得分:0)

这是由于您的服务器未响应正确的标头引起的。如果您查看“网络”标签,则会看到OPTIONS请求之前触发的POST请求。您的服务器需要响应该OPTIONS请求,以使浏览器知道可以让请求的客户端访问资源。您可以阅读有关here at MDN的更多信息,但是至少您的服务器应该使用以下标头来响应预检:

Access-Control-Allow-Origin: http://foo.example <== your domain here
Access-Control-Allow-Methods: POST, OPTIONS
Access-Control-Allow-Headers: Content-Type

答案 1 :(得分:0)

如下所示添加CORS配置:

CORSConfig.java

@Configuration
public class CORSConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD");
    }
}

或 取消您的控制器

@CrossOrigin
    @PostMapping
    public void sendFeedback(@RequestBody Feedback feedback,
            BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            throw new ValidationException("Feedback is not valid");
        }

        // Create a mail sender
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        Properties props = mailSender.getJavaMailProperties();
        mailSender.setHost(this.emailCfg.getHost());
        mailSender.setPort(this.emailCfg.getPort());
        mailSender.setUsername(this.emailCfg.getUsername());
        mailSender.setPassword(this.emailCfg.getPassword());

        // Create an email instance
        SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setFrom(feedback.getEmail());
        mailMessage.setTo("test@gmail.com");
        mailMessage.setSubject("Testing mail");
        mailMessage.setText(feedback.getFeedback());
        mailSender.send(mailMessage);
    }