对静态资源的Spring Boot GET请求中的UTF-8解码

对静态资源的Spring Boot GET请求中的UTF-8解码,spring,encoding,utf-8,get,character-encoding,Spring,Encoding,Utf 8,Get,Character Encoding,我有一个@Bean将请求重定向到我的Spring Boot后端 @Bean WebMvcConfigurer configurer () { return new WebMvcConfigurerAdapter() { @Override public void addResourceHandlers (ResourceHandlerRegistry registry) { registry.addResourceHandler("

我有一个
@Bean
将请求重定向到我的Spring Boot后端

@Bean
WebMvcConfigurer configurer () {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void addResourceHandlers (ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/data/static/images/**")
                    .addResourceLocations("file:" + System.getProperty("user.dir") + "/static/img/");
        }
    };
}
它适用于URL,例如:

http://localhost:4200/data/static/images/champion/tiles/Ahri_0.jpg

但不适用于URL,例如:

http://localhost:4200/data/static/images/champion/tiles/Tahm%20Kench_0.jpg

如果
champion
名称不包含空格、符号或单引号字符,则图像将正确显示在my Angular2前端

我运行了一个跟踪级别的日志调试,并提出了两种类型的请求——一种带有或不带有“坏”字符。目前,后端似乎在搜索正确的文件。然而,事实证明,它声称自己找不到它。我疯狂地检查了五次文件,我知道它在那里,并且打印的路径是正确的

下面是一个日志消息示例:

2018-11-18 05:07:14.496 TRACE 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Testing handler map [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@4d0bdef0] in DispatcherServlet with name 'dispatcherServlet'
2018-11-18 05:07:14.497 DEBUG 9897 --- [nio-8080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping  : Matching patterns for request [/data/static/images/champion/tiles/Tahm Kench_0.jpg] are [/data/static/images/**, /**]
2018-11-18 05:07:14.497 DEBUG 9897 --- [nio-8080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping  : URI Template variables for request [/data/static/images/champion/tiles/Tahm Kench_0.jpg] are {}
2018-11-18 05:07:14.497 DEBUG 9897 --- [nio-8080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapping [/data/static/images/champion/tiles/Tahm Kench_0.jpg] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[URL [file:/home/nuradin/Development/Java/riot-api-interface/static/img/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@5b5b59]]] and 1 interceptor
2018-11-18 05:07:14.497 TRACE 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Testing handler adapter [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter@132f4851]
2018-11-18 05:07:14.497 TRACE 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Testing handler adapter [org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@5b8d72dc]
2018-11-18 05:07:14.498 DEBUG 9897 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Last-Modified value for [/data/static/images/champion/tiles/Tahm%20Kench_0.jpg] is: -1
2018-11-18 05:07:14.498 DEBUG 9897 --- [on(7)-127.0.0.1] sun.rmi.transport.tcp                    : RMI TCP Connection(7)-127.0.0.1: (port 34127) op = 82
2018-11-18 05:07:14.498 TRACE 9897 --- [nio-8080-exec-1] o.s.w.s.resource.PathResourceResolver    : Resolving resource for request path "champion/tiles/Tahm Kench_0.jpg"
2018-11-18 05:07:14.498 TRACE 9897 --- [nio-8080-exec-1] o.s.w.s.resource.PathResourceResolver    : Checking location: URL [file:/home/nuradin/Development/Java/riot-api-interface/static/img/]

EDIT:我已经在接受的答案中实现了这个类,它肯定可以工作,因为我打印了资源名称(在编码了我遇到问题的字符之后)。但是,结果仍然是404错误

日志如下。
champion/Aatrox2Epng
位是由于下面发布的@slimane方法中的
println
语句造成的

2018-11-18 05:56:40.509 TRACE 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Testing handler adapter [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter@465ac973]
2018-11-18 05:56:40.509 TRACE 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Testing handler adapter [org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@37df7ae5]
2018-11-18 05:56:40.509 DEBUG 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Last-Modified value for [/data/static/images/champion/Aatrox.png] is: -1
2018-11-18 05:56:40.509 TRACE 12951 --- [nio-8080-exec-1] o.s.w.s.r.CachingResourceResolver        : Resolving resource for request path "champion/Aatrox.png"
2018-11-18 05:56:40.510 TRACE 12951 --- [nio-8080-exec-1] o.e.r.c.EncodedPathResourceResolver      : Resolving resource for request path "champion/Aatrox.png"
2018-11-18 05:56:40.510 TRACE 12951 --- [nio-8080-exec-1] o.e.r.c.EncodedPathResourceResolver      : Checking location: URL [file:/home/nuradin/Development/Java/riot-api-interface/static/8.23.1/img]
champion/Aatrox2Epng
2018-11-18 05:56:40.511 TRACE 12951 --- [nio-8080-exec-1] o.e.r.c.EncodedPathResourceResolver      : No match for location: URL [file:/home/nuradin/Development/Java/riot-api-interface/static/8.23.1/img]
2018-11-18 05:56:40.511 TRACE 12951 --- [nio-8080-exec-1] o.s.w.s.r.ResourceHttpRequestHandler     : No matching resource found - returning 404
2018-11-18 05:56:40.511 DEBUG 12951 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
另一个编辑--很抱歉造成混淆,我更改了路径,因为我认为带句点的路径现在可以工作了

@Bean
WebMvcConfigurer configurer () {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void addResourceHandlers (ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/data/static/images/**")
                    .addResourceLocations("file:" + System.getProperty("user.dir") + "/static/8.23.1/img")
                    .resourceChain(true)
                    .addResolver(encodedPathResourceResolver());
        }
    };
}

定义您自己的PathResourceResolver,如下所示:

import org.springframework.core.io.Resource;
import org.springframework.web.servlet.resource.PathResourceResolver;
import org.springframework.web.servlet.resource.ResourceResolver;
import java.io.IOException;

public class CustomPathResourceResolver extends PathResourceResolver implements ResourceResolver {

    @Override
    protected Resource getResource(String resourcePath, Resource location) throws IOException {
        //fixes problems with whitespaces in url
        resourcePath = resourcePath.replace(" ","%20");
        return super.getResource(resourcePath, location);
    }
}
然后将其注册到您的配置中:

@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        registry.addResourceHandler("/data/static/images/**")
                .addResourceLocations("file:" + System.getProperty("user.dir") + "/static/img/")
                .resourceChain(true)
                .addResolver(new CustomPathResourceResolver())
                ;
    }

它似乎在做同样的事情。跟踪消息显示没有任何更改。我将该方法添加到
ResourceHandler
中,并实现了
PathResourceResolver
有什么想法吗?嗯,没有任何变化,这是否意味着它没有考虑到您的CustompathResourceResolver?最近的日志显示[file:/home/nuradin/Development/Java/rio api interface/static/8.23.1/img],但是旧的[文件:/home/nuradin/Development/Java/riotapi接口/**静态**/img/],您是否仍具有如上所示的相同配置?不,很抱歉造成混淆,我更改了它,因为我认为现在可以在路径名中使用句点。我将仔细检查所有内容,但我非常确定路径是正确的。在过去6个小时中,我一直在尝试使用new
addResourceHand编辑OPlers()
你能尝试添加一个/in../img/我的意思是在你的resourceLocationNice one中,大约90%的我的图片现在以Angular2的方式加载到路径
8.23.1
(之前由于
符号
而无法工作)但是,带有特殊字符的实现尚未加载。我删除了所有实现,除了
PathResourceResolver
中的
return
,并简单地打印了
resource
参数。结果是大量条目,例如:
champion/nuu%20%26%20Willump.png champion/Rek%27Sai.png champion/Twisted%20Fate.png
如果我理解,您跳过了在配置中替换空白,但仍然在文件名中看到%20,请尝试将其替换为空白,然后查看您可以得到什么