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;
}
}
Единственная вещь, которая до сих пор остается для меня загадкой, это порядок фильтров, мне пришлось выбрать очень низкое значение, чтобы заставить его работать...