import org.apache.catalina.core.ApplicationPart;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
/**
* @author zlw
* @date 2018/11/13
* @description
*/
public class UploadFileInterceptor implements HandlerInterceptor {
/** 允许上传的图片格式 */
private static final String[] PERMITTED_IMAGE_TYPE = {"jpg", "png"};
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//在请求处理之前进行调用(Controller方法调用之前)
// 只有返回true才会继续向下执行,返回false取消当前请求
return isImageQuealified(httpServletRequest);
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
//请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
//在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
}
/**
* 注意:此方法不具有普适性,只适用于http的post请求,且第一个参数为MultipartFile类型的
* 校验所拦截的请求中上传的图片的格式是否合格
*/
private boolean isImageQuealified (HttpServletRequest httpServletRequest) throws IOException, ServletException {
Collection<Part> parts = httpServletRequest.getParts();
String fileType = "";
if (null != parts && parts.size() > 0) {
List list = (List) parts;
ApplicationPart partZero = (ApplicationPart) list.get(0);
String zeroName = partZero.getSubmittedFileName();
String trimedName = zeroName.trim();
int lastDotIndex = trimedName.lastIndexOf(".");
fileType = trimedName.substring(lastDotIndex + 1, trimedName.length());
}
for (String s : PERMITTED_IMAGE_TYPE) {
if (fileType.equalsIgnoreCase(s)) {
return true;
}
}
return false;
}
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
* 拦截器注册配置
*/
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
/**
* 上传的图片校验拦截器,将拦截器作为bean写入配置中,不能直接new,否则拦截器无法注入服务
*/
@Bean
public UploadFileInterceptor uploadFileInterceptor() {
return new UploadFileInterceptor();
}
/**
* 拦截器注册
*
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 多个拦截器组成一个拦截器链
// addPathPatterns 用于添加拦截规则
// excludePathPatterns 用户排除拦截
registry.addInterceptor(loginInterceptor());
registry.addInterceptor(uploadFileInterceptor()).addPathPatterns("/pacs/uploadScreenShot");//对上传图片接口拦截,做图片格式校验
}
}