Spring - Выполнить до того, как веб-запросы будут завершены, и RequestMapping get будет запущен

Я ищу способ выполнить что-то до вызова RequestMapping. Чтобы быть немного более наглядным, у меня есть контроллер для загрузки файлов, например:

@Controller
@RequestMapping("/ul")
public class UploadController
{

    @RequestMapping(value = "/{ticket}", method = RequestMethod.POST)
    public String ul(ModelMap model, HttpServletResponse response, @PathVariable("ticket") String ticket)
    {
      ...

пока все отлично работает. Моя проблема в том, что я использую загрузку билетов, чтобы проверить, может ли пользователь загрузить файл, и эти билеты имеют ограниченный срок действия, когда пользователь загружает действительно большой файл или из-за плохого соединения, и это займет несколько минут, скорее всего билет будет быть недействительным и загрузка прекращена.

Есть ли способ реализовать что-то, чтобы получать уведомления при установлении соединения? Например, когда вызывается URL, чтобы я мог проверить билет напрямую и, может быть, даже закрыть соединение?

Я уже пробовал перехватчик, абстрактный контроллер, многочастный распознаватель с слушателем прогресса, но все это слишком поздно, и события запускаются, когда действие (передача файла) выполнено.

2 ответа

Хорошо, вы можете использовать фильтры или исполнители для этой цели, фильтры поставляются с контейнером сервлета и могут использоваться для манипулирования запросом, исполнители поставляются со структурой spring-mvc, есть несколько исполнителей.

что дает нам точки выреза на разных этапах

Похоже, я получил его на работу сейчас!

Я создал класс UploadFilter:

@Component
public class UploadFilter implements Filter
{

    @Override
    public void init(FilterConfig filterConfig) throws ServletException
    {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
    {
        chain.doFilter(request, response);
    }

    @Override
    public void destroy()
    {

    }

}

и добавил FilterRegistrationBean в класс конфигурации загрузки:

@Configuration
public class UploadConfiguration
{

    @Bean
    public MultipartConfigElement multipartConfigElement()
    {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setMaxFileSize("2000MB");
        factory.setMaxRequestSize("2000MB");
        return factory.createMultipartConfig();
    }

    @Bean
    public FilterRegistrationBean uploadFilter()
    {
        FilterRegistrationBean filterRegBean = new FilterRegistrationBean();
        filterRegBean.setFilter(new UploadFilter());
        filterRegBean.addUrlPatterns("/ul/*");
        filterRegBean.setEnabled(Boolean.TRUE);
        filterRegBean.setName("uploadFilter");
        filterRegBean.setAsyncSupported(Boolean.TRUE);
        filterRegBean.setOrder(Integer.MAX_VALUE + 1);
        return filterRegBean;
    }

}

Единственная вещь, которая до сих пор остается для меня загадкой, это порядок фильтров, мне пришлось выбрать очень низкое значение, чтобы заставить его работать...

Другие вопросы по тегам