Angular 和 Spring boot -> POST 请求响应 403

Angular and Spring boot -> POST Request response 403

提问人:Marine Gomes 提问时间:9/15/2022 最后编辑:Marine Gomes 更新时间:10/10/2022 访问量:257

问:

我在使用 Spring boot 和 Angular 时遇到了问题。我提出了一个 POST 请求,该请求适用于 POSTMAN 和本地,但它给了我一个 403 在 tomcat 上生产,并使用 apache 作为反向代理。但是当我使用嵌入式雄猫时,它正在工作。

我必须尽快尝试一切。

我见过的所有解决方案都说要禁用 CSFR,但我没有身份验证来访问我的 Web 服务,因此没有 spring-security 依赖项。

无论如何我都试过了,但问题仍然存在。在某些情况下,它需要我登录,而我不想这样做


import ch.megahertz.swissqrbillsgeneratorapi.properties.FileStorageProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication(scanBasePackages = {"ch.megahertz.swissqrbillsgeneratorapi.*"})
@EnableConfigurationProperties({
        FileStorageProperties.class
})

public class SwissQrBillsGeneratorApiApplication extends SpringBootServletInitializer {

    static Logger logger = LoggerFactory.getLogger(SwissQrBillsGeneratorApiApplication.class);
    public static void main(String[] args) {
        logger.info("Run application");
        SpringApplication.run(SwissQrBillsGeneratorApiApplication.class, args);
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {

        return application.sources(SwissQrBillsGeneratorApiApplication.class);
    }



}


import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedMethods("*")
                .allowedHeaders("*")
                .allowedOrigins("*")
                .allowCredentials(false)
                .maxAge(-1);
    }

}


import ch.megahertz.swissqrbillsgeneratorapi.payload.Invoice;
import ch.megahertz.swissqrbillsgeneratorapi.service.CRMService;
import ch.megahertz.swissqrbillsgeneratorapi.service.FileStorageService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;


//@CrossOrigin(origins = {"https://swissqrbillsgenerator.megahertz.ch/","http://localhost:4200/"})
@Slf4j
@RestController
public class ApiController {

    private static final Logger logger = LoggerFactory.getLogger(ApiController.class);

    @Autowired
    private FileStorageService fileStorageService;

    @Autowired
    private CRMService crmService;

    @GetMapping
    public String generateQRBills() {
        log.info("Enter in GeT API");
    return "Get ok";
    }

    @PostMapping("/generate")
    public ResponseEntity<Resource> uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
        System.out.println("Enter in generate API");
        logger.info("Enter in generate API");
        log.info("Enter in generate POST API");
        String fileName = fileStorageService.storeFile(file);

        String fileDownloadUri = ServletUriComponentsBuilder.fromCurrentContextPath()
                .path("/downloadFile/")
                .path(fileName)
                .toUriString();

        Invoice facture = crmService.getFactureInfo(fileName);
        File fileWithQR = fileStorageService.addQrToFile(fileName, facture);

        Resource resource = new UrlResource(fileWithQR.toURI());
           return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_TYPE,Files.probeContentType(resource.getFile().toPath()))
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName+ "\"")
                    .body(resource);


    }
}

你有什么想法吗?

java angular spring-boot Apache tomcat

评论

0赞 user2304483 9/30/2022
如果你得到 403,我可能会尝试这些:首先重新创建你的 pom 文件并确保不存在 sevurity。其次,使用 RequestParamter 向 contrller 显示文件,这很好,但不显示发送文件/请求的 Web 应用代码。
0赞 Marine Gomes 10/11/2022
当我使用 mvn spring-boot:run 运行应用程序时,我没有任何问题,只有当我是外部雄猫时

答:

0赞 C Sher 10/9/2022 #1

如果 Postman 返回查询,那么问题可能出在 Angular 前端。我相信当我尝试从后端发送 String 时,我遇到了 403 错误,它必须包装在一个对象中并由 Angular 解包才能成为 Angular 中的字符串。