我已经将一个Web应用程序从Spring Boot 1.5.10迁移到2.0.0,它通过不同的域提供内容,并使用Heroku进行部署。主域工作正常,但与其他的一样,静态元素如Javascript,CSS,图像和图标不起作用,浏览器出现此错误:
拒绝从''执行脚本,因为它的MIME类型('text / html')不可执行,并且启用了严格的MIME类型检查
静态资源位于:
/resources/static/css
/resources/static/js
/resources/static/images
所有域都使用Heroku提供的Let's Encrypt SSL证书进行保护。这些域都被重定向,包括主域,其中CNAME为Heroku提供的地址。
主域可以访问所有内容,而辅助域只能访问目录中的内容。例如:
maindomain.com/1/
工作正常但secondarydomain.com/1/
不起作用。
使辅助域与主域不同的是,通过HandlerInterceptor
的实现,我们控制他们只能访问其目录中的内容。这是preHandle实现的代码:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
serverName = request.getServerName();
if("POST".equals(request.getMethod())){
return true;
}
//We check if the request comes from one of the main domains
if(!checkRentalWebsURL(RwConstants.SERVER_NAMES, serverName)){
if(idweb == null){
Web web = webRepository.getWebByDomain(serverName);
if(web != null){
idweb = web.getIdweb();
} else {
response.sendRedirect(RwConstants.RW_URL);
}
}
String URI = request.getRequestURI();
String rootURI = "/" + idweb + "/";
if(URI.equals("/") || !URI.startsWith(rootURI)){
URI = rootURI;
RequestDispatcher requestDispatcher = request.getRequestDispatcher(request.getContextPath() + URI);
requestDispatcher.forward(request, response);
}
}
return true;
}
我尝试解决此问题,将此代码设置为WebSecurityConfigurerAdapter
的扩展名:
http
.authorizeRequests()
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
答案 0 :(得分:1)
解决方案是在实现WebMvcConfigurer
时在拦截器注册中排除不同静态资源的路径。这是代码的一部分:
public void addInterceptors(InterceptorRegistry registry) {
...
registry.addInterceptor(rootDomainInterceptor())
.excludePathPatterns("/js/**", "/css/**", "/images/**", "/webjars/**");
}
rootDomainInterceptor()
是HandleInterceptor
的实现,我用它来处理访问该应用程序的不同域。
答案 1 :(得分:0)
我最近也遇到了类似的问题。我刚刚添加了整个资源目录。
public void addInterceptors(InterceptorRegistry registry) {
...
registry.addInterceptor(rootDomainInterceptor())
.excludePathPatterns("/recources/**");
}