Spring boot 1.5.9, ошибка 404 при доступе к образам ресурсов в контейнере Docker - PullRequest
6 голосов
/ 03 апреля 2020

В приложении Spring Boot 1.5.9 я хочу получить доступ к ресурсам stati c через HTTP, используя Google Chrome.

В Docker У меня 404 ошибка, он отлично работал во встроенном tomcat.

Конфигурация

Это Dockerfile:

FROM openjdk:8-jre-alpine
VOLUME /tmp

RUN addgroup -S spring --gid 13371 && adduser -S spring -G spring --uid 13371
RUN mkdir -p /srv/upload
RUN chown -R spring:spring /srv/upload

ADD *.jar app.jar
RUN sh -c 'touch /app.jar'

USER spring:spring

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Duser.timezone=UTC","-jar","/app.jar"]

Вот как я настраиваю ресурсы stati c:

public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter { 
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("file:upload/images/")
                .setCachePeriod(0);
    }
}

Результат

Это журнал результатов, когда я получаю доступ к URL с chrome в docker http://localhost:8080/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png

Counting up[http-nio-8080-Acceptor-0] latch=1
Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@45deea1:org.apache.tomcat.util.net.NioChannel@68f517c7:java.nio.channels.SocketChannel[connected local=/127.0.0.1:8080 remote=/127.0.0.1:47510]], Read from buffer: [0]
Received [GET /resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
Sec-Fetch-Dest: document
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,fr-FR;q=0.8,fr;q=0.7,ru-RU;q=0.6,ru;q=0.5,vi-VN;q=0.4,vi;q=0.3

]
Security checking request GET /resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png
  No applicable constraints defined
 Not subject to any constraint
Bound request context to thread: org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper@1f960fc1
Trying to match using Ant [pattern='/oauth/token']
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/oauth/token'
Trying to match using Ant [pattern='/oauth/token_key']
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/oauth/token_key'
Trying to match using Ant [pattern='/oauth/check_token']
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/oauth/check_token'
No matches found
Trying to match using Ant [pattern='/favicon.ico']
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/favicon.ico'
Trying to match using Ant [pattern='/favicon.png']
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/favicon.png'
Trying to match using Ant [pattern='/login']
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/login'
Trying to match using Ant [pattern='/logout']
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/logout'
Trying to match using Ant [pattern='/ping']
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/ping'
Trying to match using Ant [pattern='/oauth/authorize']
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/oauth/authorize'
Trying to match using Ant [pattern='/cb/**']
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/cb/**'
Trying to match using Ant [pattern='/']
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/'
Trying to match using Ant [pattern='/public/**']
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/public/**'
Trying to match using Ant [pattern='/resources/**']
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/resources/**'
matched
/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png at position 1 of 11 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png at position 2 of 11 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'
Set encoding to ISO-8859-1
No HttpSession currently exists
No SecurityContext was available from the HttpSession: null. A new one will be created.
/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png at position 3 of 11 in additional filter chain; firing Filter: 'HeaderWriterFilter'
Not injecting HSTS header since it did not match the requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@1877aac3
/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png at position 4 of 11 in additional filter chain; firing Filter: 'LogoutFilter'
Trying to match using Ant [pattern='/logout', GET]
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/logout'
Trying to match using Ant [pattern='/logout', POST]
Request 'GET /resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png' doesn't match 'POST /logout
Trying to match using Ant [pattern='/logout', PUT]
Request 'GET /resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png' doesn't match 'PUT /logout
Trying to match using Ant [pattern='/logout', DELETE]
Request 'GET /resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png' doesn't match 'DELETE /logout
No matches found
/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png at position 5 of 11 in additional filter chain; firing Filter: 'UsernamePasswordAuthenticationFilter'
Request 'GET /resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png' doesn't match 'POST /login
/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png at position 6 of 11 in additional filter chain; firing Filter: 'RequestCacheAwareFilter'
/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png at position 7 of 11 in additional filter chain; firing Filter: 'SecurityContextHolderAwareRequestFilter'
/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png at position 8 of 11 in additional filter chain; firing Filter: 'AnonymousAuthenticationFilter'
Populated SecurityContextHolder with anonymous token: 'org.springframework.security.authentication.AnonymousAuthenticationToken@9055e4a6: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@957e: RemoteIpAddress: 127.0.0.1; SessionId: null; Granted Authorities: ROLE_ANONYMOUS'
/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png at position 9 of 11 in additional filter chain; firing Filter: 'SessionManagementFilter'
/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png at position 10 of 11 in additional filter chain; firing Filter: 'ExceptionTranslationFilter'
/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png at position 11 of 11 in additional filter chain; firing Filter: 'FilterSecurityInterceptor'
Trying to match using Ant [pattern='/logout', GET]
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/logout'
Trying to match using Ant [pattern='/logout', POST]
Request 'GET /resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png' doesn't match 'POST /logout
Trying to match using Ant [pattern='/logout', PUT]
Request 'GET /resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png' doesn't match 'PUT /logout
Trying to match using Ant [pattern='/logout', DELETE]
Request 'GET /resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png' doesn't match 'DELETE /logout
No matches found
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/favicon.ico'
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/favicon.png'
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/ping'
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/public/**'
Checking match of request : '/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png'; against '/resources/**'
Secure object: FilterInvocation: URL: /resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png; Attributes: [permitAll]
Previously Authenticated: org.springframework.security.authentication.AnonymousAuthenticationToken@9055e4a6: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@957e: RemoteIpAddress: 127.0.0.1; SessionId: null; Granted Authorities: ROLE_ANONYMOUS
Voter: org.springframework.security.web.access.expression.WebExpressionVoter@6f01175d, returned: 1
Authorization successful
RunAsManager did not change Authentication object
/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png reached end of additional filter chain; proceeding with original chain
DispatcherServlet with name 'dispatcherServlet' processing GET request for [/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png]
Looking up handler method for path /resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png
looking up handler for path: /resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png
Did not find handler method for [/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png]
Looking up handler method for path /resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png
Did not find handler method for [/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png]
Looking up handler method for path /resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png
Did not find handler method for [/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png]
Looking up handler method for path /resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png
Did not find handler method for [/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png]
Looking up handler method for path /resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png
Did not find handler method for [/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png]
Looking up handler method for path /resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png
Did not find handler method for [/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png]
Matching patterns for request [/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png] are [/resources/**, /**]
URI Template variables for request [/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png] are {}
Mapping [/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[URL [file:upload/images/], class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@6f49d153]]] and 1 interceptor
Last-Modified value for [/resources/promotions/37/lg/31723d95-eec3-4ff9-aa42-e3477559e9df.png] is: -1
SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.
Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
Successfully completed request
Chain processed normally
SecurityContextHolder now cleared, as request processing completed
Cleared thread-bound request context: org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper@1f960fc1
Processing ErrorPage[errorCode=0, location=/error]
DispatcherServlet with name 'dispatcherServlet' processing GET request for [/error]
Looking up handler method for path /error
looking up handler for path: /error
Did not find handler method for [/error]
Looking up handler method for path /error
Did not find handler method for [/error]
Looking up handler method for path /error
Returning handler method [public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)]
Returning cached instance of singleton bean 'basicErrorController'
Last-Modified value for [/error] is: -1
Requested media types are [text/html, text/html;q=0.8] based on Accept header types and producible media types [text/html])
Returning cached instance of singleton bean 'error'
Returning [org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$SpelView@351e414e] based on requested media type 'text/html'
Rendering view [org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$SpelView@351e414e] in DispatcherServlet with name 'dispatcherServlet'
Successfully completed request
 Disabling the response for further output
Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@45deea1:org.apache.tomcat.util.net.NioChannel@68f517c7:java.nio.channels.SocketChannel[connected local=/127.0.0.1:8080 remote=/127.0.0.1:47510]], Read from buffer: [0]
Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@45deea1:org.apache.tomcat.util.net.NioChannel@68f517c7:java.nio.channels.SocketChannel[connected local=/127.0.0.1:8080 remote=/127.0.0.1:47510]], Status in: [OPEN_READ], State out: [OPEN]

Ожидается

Это то, что я ожидаю (в среде разработки) при доступе к http://localhost:8080/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg

Counting up[http-nio-8080-Acceptor-0] latch=1
Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@4d64a855:org.apache.tomcat.util.net.NioChannel@3eaf8ba0:java.nio.channels.SocketChannel[connected local=/127.0.0.1:8080 remote=/127.0.0.1:59330]], Read from buffer: [0]
Received [GET /resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
Sec-Fetch-Dest: document
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,fr-FR;q=0.8,fr;q=0.7,ru-RU;q=0.6,ru;q=0.5,vi-VN;q=0.4,vi;q=0.3

]
Security checking request GET /resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg
  No applicable constraints defined
 Not subject to any constraint
Bound request context to thread: org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper@29e45b2
Trying to match using Ant [pattern='/']
Checking match of request : '/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg'; against '/'
Trying to match using Ant [pattern='/public/**']
Checking match of request : '/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg'; against '/public/**'
Trying to match using Ant [pattern='/resources/**']
Checking match of request : '/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg'; against '/resources/**'
matched
/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg at position 1 of 11 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg at position 2 of 11 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'
Set encoding to ISO-8859-1
No HttpSession currently exists
No SecurityContext was available from the HttpSession: null. A new one will be created.
/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg at position 3 of 11 in additional filter chain; firing Filter: 'HeaderWriterFilter'
Not injecting HSTS header since it did not match the requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@204c4db
/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg at position 4 of 11 in additional filter chain; firing Filter: 'LogoutFilter'
Trying to match using Ant [pattern='/logout', GET]
Checking match of request : '/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg'; against '/logout'
Trying to match using Ant [pattern='/logout', POST]
Request 'GET /resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg' doesn't match 'POST /logout
Trying to match using Ant [pattern='/logout', PUT]
Request 'GET /resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg' doesn't match 'PUT /logout
Trying to match using Ant [pattern='/logout', DELETE]
Request 'GET /resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg' doesn't match 'DELETE /logout
No matches found
/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg at position 5 of 11 in additional filter chain; firing Filter: 'UsernamePasswordAuthenticationFilter'
Request 'GET /resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg' doesn't match 'POST /login
/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg at position 6 of 11 in additional filter chain; firing Filter: 'RequestCacheAwareFilter'
/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg at position 7 of 11 in additional filter chain; firing Filter: 'SecurityContextHolderAwareRequestFilter'
/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg at position 8 of 11 in additional filter chain; firing Filter: 'AnonymousAuthenticationFilter'
Populated SecurityContextHolder with anonymous token: 'org.springframework.security.authentication.AnonymousAuthenticationToken@9055e4a6: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@957e: RemoteIpAddress: 127.0.0.1; SessionId: null; Granted Authorities: ROLE_ANONYMOUS'
/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg at position 9 of 11 in additional filter chain; firing Filter: 'SessionManagementFilter'
/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg at position 10 of 11 in additional filter chain; firing Filter: 'ExceptionTranslationFilter'
/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg at position 11 of 11 in additional filter chain; firing Filter: 'FilterSecurityInterceptor'
No matches found
g/843291ef-2309-4809-9f37-38257e087a97.jpeg'; against '/public/**'
Checking match of request : '/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg'; against '/resources/**'
Secure object: FilterInvocation: URL: /resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg; Attributes: [permitAll]
Previously Authenticated: org.springframework.security.authentication.AnonymousAuthenticationToken@9055e4a6: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@957e: RemoteIpAddress: 127.0.0.1; SessionId: null; Granted Authorities: ROLE_ANONYMOUS
Voter: org.springframework.security.web.access.expression.WebExpressionVoter@199cd81c, returned: 1
Authorization successful
RunAsManager did not change Authentication object
/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg reached end of additional filter chain; proceeding with original chain
DispatcherServlet with name 'dispatcherServlet' processing GET request for [/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg]
Looking up handler method for path /resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg
looking up handler for path: /resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg
Did not find handler method for [/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg]
Looking up handler method for path /resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg
Did not find handler method for [/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg]
Looking up handler method for path /resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg
Did not find handler method for [/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg]
Looking up handler method for path /resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg
Did not find handler method for [/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg]
Looking up handler method for path /resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg
Did not find handler method for [/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg]
Looking up handler method for path /resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg
Did not find handler method for [/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg]
Matching patterns for request [/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg] are [/resources/**, /**]
URI Template variables for request [/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg] are {}
Mapping [/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[URL [file:upload/images/], class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@49a0fe14]]] and 1 interceptor
Last-Modified value for [/resources/promotions/39/lg/843291ef-2309-4809-9f37-38257e087a97.jpeg] is: -1
SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.
Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
Successfully completed request

Исследование

Я реплицировал производственную среду локально и использовал тот же абсолютный путь file:/srv/upload/images в разработке, я могу подтвердить, что код состояния различается в пределах docker и без него:

  • во встроенном коте: 200
  • в docker : 404

Проблема не в том, что путь отличается, а только из-за docker.

Вопрос * 10 44 * Есть какой-то шаг, который я забыл? Любой намек был бы очень признателен.

1 Ответ

3 голосов
/ 11 апреля 2020

У меня недостаточно очков репутации, чтобы оставить комментарий, поэтому я пишу свой комментарий в качестве ответа: (

У меня была похожая проблема с docker и ресурсами, поэтому я хотел бы помочь you.

Не могли бы вы предоставить журналы с уровнем TRACE? Этот уровень помогает нам увидеть, что происходит внутри PathResourceResolver, и в соответствии с этой реализацией трассировка используется в большинстве случаев.

В моем случае это было полезно и помогло мне.

Согласно this

Вы можете включить режим «трассировки» с помощью запуск вашего приложения с флагом --trace (или trace = true в ваших application.properties)

...