2017-08-17 27 views
1

我正在寻找一种在RequestMapping调用之前执行某些操作的方法。为了更具描述性,我有一个文件上传控制器,如:Spring - 在Web请求完成之前执行并且RequestMapping get被触发

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

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

到目前为止一切正常。我现在的问题是,我使用上传故障单来验证用户是否可以上传文件,并且这些故障单的使用期限有限,当用户上传一个非常大的文件或连接不良时,这将需要几分钟的时间无效并且上传丢失。

有什么办法可以实现某些东西来获得连接建立时的通知?就像URL被调用时一样,我可以直接验证票证,甚至可以关闭连接?

我已经尝试了一个拦截器,抽象控制器,commons multipart resolver与进度监听器,但所有这些都是为了延迟,并且当动作(文件传输)完成时触发事件。

回答

1

那么你可以使用过滤器或执行人为此,过滤器随servlet容器,可以用来操纵请求,执行者来与弹簧MVC框架,有几个执行人

这给我们在不同阶段的切点

+0

感谢您的提示。我尝试了过滤方法,但在请求完成后触发“doFilter”事件。难道我做错了什么? –

+0

我添加了一个UploadSecurity类来扩展WebSecurityConfigurerAdapter,并且在配置中我做了:http.antMatcher(“/ ul/**”)。addFilterBefore(new UploadFilter(),BasicAuthenticationFilter.class).sessionManagement()。sessionCreationPolicy(SessionCreationPolicy。总是); –

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; 
    } 

} 

这仍然是一个谜我是滤波器的阶的唯一的事,我不得不选择一个非常低的价值,以使其运行...

相关问题