Spring Boot 2.0.0&同一应用程序的不同域的静态资源

时间:2018-04-09 21:36:04

标签: java spring-boot spring-security

我已经将一个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()

2 个答案:

答案 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/**");
    
    }