使用代理到后端在本地PC上下载文件时,连接被拒绝

时间:2019-02-12 13:48:14

标签: angular

这是我的设置。我在局域网中的PC上运行了角度应用和角度应用。

我有一个功能,当单击该功能时,会在另一个窗口中打开pdf文件。

openPdf(element: Acte) {
this.acteService.getPdf(element.url).subscribe((response) => {
  let file = new Blob([response], {type: 'application/pdf'});
  const fileUrl = URL.createObjectURL(file);
  window.open(fileUrl);
 });
 }

element.url将类似于http://localhost:8080/api/download/file.pdf

我的服务:

getPdf(name: string) {

const httpOpt = {
  'responseType'  : 'arraybuffer' as 'json'
};
return this.http.get<any>(name, httpOpt);
} 

我遵循这些准则来代理我的后端。 https://github.com/angular/angular-cli/blob/master/docs/documentation/stories/proxy.md

我所有在angular中的链接都是/ api / something ...

我的弹簧控制器看起来像:

@RestController
@CrossOrigin(origins = "http://localhost:4200", maxAge = 3600)
@RequestMapping("/api")
public class FileDownloadController {
private static final String EXTERNAL_FILE_PATH = "./download/";
@GetMapping("/download/{fileName:.+}")
public void downloadPDFResource(HttpServletRequest request, 
HttpServletResponse response, @PathVariable("fileName") String fileName) 
throws IOException {
   File file = new File(EXTERNAL_FILE_PATH + fileName);
   if (file.exists()) {
        System.out.println("exista ");
        String mimeType = 
URLConnection.guessContentTypeFromName(file.getName());
        if (mimeType == null) {
            mimeType = "application/octet-stream";
        }
        response.setContentType(mimeType);
        response.setHeader("Content-Disposition", String.format(
                "inline; filename=\"" + file.getName() + "\""
        ));
        response.setContentLength((int) file.length());
        InputStream inputStream = new BufferedInputStream(new 
 FileInputStream(file));
        FileCopyUtils.copy(inputStream, response.getOutputStream());
    }
}

我的应用当前在本地运行,因此我启动ng serve --host 0.0.0.0。在本地主机上的另一台PC上,我可以在PC的IP上运行该应用,并添加:4200端口。问题是,当我单击按钮时,我得到了

在我的控制台中“选项:http://localhost:8080/api/download/myfile.pdf网:ERR_CONNECTION_REFUSED”。在运行spring app和angular app的PC上不会发生这种情况。

可以从网络中的另一台PC访问所有其他控制器,我只是对/ download有问题 我想念什么?

关于CORS问题,这是我的webmvcconfig

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
private final long MAX_AGE_SECS = 3600;
@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
            .allowedOrigins("*")
            .allowedHeaders("*")
            .allowedMethods("OPTIONS", "GET", "POST", "PUT", "DELETE")
            .exposedHeaders("Authorization")
            .allowCredentials(true)
            .maxAge(MAX_AGE_SECS);
}
}

我的春季有12个控制器,这是网络中另一台PC上唯一有问题的控制器,其他所有控制器都返回正常状态。

编辑:

我的安全配置为:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .cors().and().csrf().disable()
        .authorizeRequests()
            .antMatchers("/api/socket").permitAll()
            .antMatchers("/api/auth/**").permitAll()
            .anyRequest().authenticated()
        .and()

.exceptionHandling().authenticationEntryPoint(unauthorizedHandler)
        .and()

.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
            .addFilterBefore(authenticationJwtTokenFilter(), 
UsernamePasswordAuthenticationFilter.class);
 }

1 个答案:

答案 0 :(得分:0)

我的项目中也遇到了类似的问题,该问题也与Angular和Spring引导一起运行。

我认为这是一个CORS问题,就像您一样,我包括了CORS配置。 尽管如此,解决我问题的方法是在application.properties中包含CORS配置。

我做了什么:

management.endpoints.web.cors.allow-credentials=* # Whether credentials are supported. When not set, credentials are not supported.
management.endpoints.web.cors.allowed-headers=* # Comma-separated list of headers to allow in a request. '*' allows all headers.
management.endpoints.web.cors.allowed-methods=* # Comma-separated list of methods to allow. '*' allows all methods. When not set, defaults to GET.
management.endpoints.web.cors.allowed-origins=* # Comma-separated list of origins to allow. '*' allows all origins. When not set, CORS support is disabled.
management.endpoints.web.cors.exposed-headers=* # Comma-separated list of headers to include in a response.
management.endpoints.web.cors.max-age=3600s

我希望它也能解决您的问题。 祝你好运。