Spring - 在Web请求完成之前执行并触发RequestMapping

时间:2017-08-17 15:21:17

标签: java spring spring-mvc spring-boot

我正在寻找在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 个答案:

答案 0 :(得分:1)

那么你可以为此目的使用过滤器或执行器,过滤器附带servlet容器并可用于操作请求,执行器附带spring-mvc框架,有几个执行器

  

给了我们不同阶段的切分点

答案 1 :(得分:0)

看起来我现在已经开始工作了!

我创建了一个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;
    }

}

对我来说唯一仍然是个谜的是过滤器顺序,我必须选择一个非常低的值才能让它工作......