这是我的设置。我在局域网中的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);
}
答案 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
我希望它也能解决您的问题。 祝你好运。