Spring MVC есть ли способ получить полный путь из файла сопоставления/**?

Я хочу иметь отображение, которое будет соответствовать file/+ любой путь, например file/image.jpgили file/a/b/c/image.jpgи я хочу получить полный путь после file/того, как я могу это сделать, если у меня есть только 1 переменная пути:

file/{file_name}

Но не знаю, как это сделать для моего случая. Я знаю, что я могу сопоставить простоfile/**, а затем получить путь, как это:

 (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);

Но я ищу более элегантное решение.

1 ответ

  1. Одним из способов сделать это было бы использование spring-mvcперехватчика

    Перед созданием HTTP-запроса кодируйте переменную file_namepath URLEncoderтаким образом, чтобы можно было отправить ее с косыми чертами, и запрос обрабатывается корректным обработчиком. Затем необходимо создать перехватчик, метод которого вызывается перед методом контроллера. В перехватчике вы бы декодировали переменную пути назад С URLDecoderи установить его обратно в качестве атрибута. Имя атрибутов задается HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTEконстантой и содержит карту всех переменных пути.

    Перехватчик должен реализовать HandlerInterceptorинтерфейс или расширитьHandlerInterceptorAdapter, если вы не хотите реализовать все методы интерфейса.

    Что-то вроде этого

    public class UrlDecodeInterceptor extends HandlerInterceptorAdapter {
    
    private static final String ATTRIBUTE_VARIBLE_PATH = "file_name";
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
    
        Map<String, String> pathVariables = (Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
    
        if (pathVariables.containsKey(ATTRIBUTE_VARIBLE_PATH)) {
            String decoded = URLDecoder.decode(pathVariables.get(ATTRIBUTE_VARIBLE_PATH), "UTF-8");
    
            pathVariables.put(ATTRIBUTE_VARIBLE_PATH, decoded);
        }
    
        return true;
    }
    }
    

    По умолчанию, spring-mvcдекодирует URL-адреса самостоятельно. Его необходимо отключить в spring-сервлете.xml или любой файл конфигурации сервлета.

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
       <property name="urlDecode" value="false" />
    </bean>
    

    Тогда вам необходимо зарегистрировать UrlDecodeInterceptorперехватчик в том же файле

    <mvc:interceptors>
        <bean id="urlDecodeInterceptor" class="path.to.your.package.UrlDecodeInterceptor" />
    </mvc:interceptors>
    

    В конце концов, ваш обработчик контроллера будет выглядеть так

    @RequestMapping(value = "/file/{file_name}")
    public String someMethodName(@PathVariable("file_name") String fileName) {
    
        System.out.println(fileName); // should contain decoded file_name
    
        return null
    }