2021.8.9拦截器
拦截器实现步骤(3步)
-
配置好拦截器要怎么拦截,拦截后做什么 (配置一个实现了HandlerInterceptor接口的类) -
将这些配置放在容器中,编写一个实现了WebMvcConfigurer的配置(所有定制web功能的配置类都必须实现WebMvcConfigurer接口) -
指定拦截规则(拦截哪些请求)
HandlerInterceptor接口
拦截器必须实现HandlerInterceptor接口,有三个方法
-
preHandle 目标方法执行之前 -
postHandle 目标方法执行之后 -
afterCompletion 页面渲染以后
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session=request.getSession();
Object loginUser=session.getAttribute("loginUser");
if (loginUser!=null){
return true;
}else {
request.setAttribute("msg","请先登录"); request.getRequestDispatcher("/").forward(request,response);
return false;
}
}
postHandle方法{...}
afterCompletion方法{...}
}
配置拦截器
@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**","/error/**");
}
}
文件上传
前端代码:
<form th:action="@{/upload}" method="post" enctype="multipart/form-data">
<input type="file" name="headImg">
</form>
后端代码:
@PostMapping("/upload")
public String fileUpload(@RequestParam("email") String email,
@RequestParam("username") String username,
@RequestPart("headImg")MultipartFile headImg,
@RequestPart("photos") MultipartFile[] photos) throws IOException {
log.info("邮箱{},用户名{},头像大小{},生活照数量{}",email,username,headImg.getSize(),photos.length);
String originalFilename = headImg.getOriginalFilename();
headImg.transferTo(new File("D:\\AAAProgram\\项目\\我的后台管理系统搭建学习\\上传文件\\"+originalFilename));
for (MultipartFile photo:photos) {
String originalFilename1 = photo.getOriginalFilename();
photo.transferTo(new File("D:\\AAAProgram\\项目\\我的后台管理系统搭建学习\\上传文件夹\\"+originalFilename1));
}
注意:可以通过下面配置更改上传文件最大大小等配置
#配置上传的单个文件最大大小
spring.servlet.multipart.max-file-size=10MB
#配置请求总大小
spring.servlet.multipart.max-request-size=100MB
异常处理:
-
默认规则 默认情况下,SpringBoot提供/error处理所有错误的映射。 对于机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。对于浏览器客户端,将响应一个"whitelable"错误视图,以HTML格式呈现相同的数据。 若想对其自定义,添加View解析为error 要完全替换默认行为,可以实现ErrorController并注册该类型的Bean定义,或添加ErrorAttribute类型的组件以使用现有机制但替换其内容。 -
定义错误处理逻辑
- 自定义错误页 在templates下建一个error文件夹,放入400,500等错误页面
- error/404.html error/5xx.html 定义为5xx就会响应所有5开头的错误,定义为500就只响应500错误
- @ControllerAdvice+@ExceptionHandler处理异常
- 实现HandlerExceptionResolver处理异常
Web原生组件的使用
在SpringBoot中使用servlet:
- 编写一个继承了HttpServlet的Servlet类,在这个类上添加@WebServlet("/xxx")
- 在启动类上添加@ServletComponentScan(basePackages=“com.hs.xxx”)指定原生的servlet组件放在哪里
这样生成的url没有经过拦截器
在SpringBoot中使用filter
编写一个实现了Filter接口的Filter类,在其上添加@WebFilter(urlPatterns = {"/css/","/fonts/","/images/*"})
其中有3个方法
- init() 项目启动时执行,初始化过滤器
- doFilter() 过滤请求时执行
- destory()
在SpringBoot中使用Listener
编写一个实现了ServletContextListener接口的类
其中有2个方法:
- contextInitialized() 项目初始化完成时执行
- contextDestroyed() 项目销毁时执行
还有另一种办法在SpringBoot中使用Servlet等
通过使用ServletRegistrationBean, FilterRegistrationBean,ServletListenerRegistrationBean等注册Servlet等。
需要先按照第一种方法创建Servlet,然后将对应组件添加到IoC容器中,不需要添加注解
@Configuration
public class MyRegistryConfig {
@Bean
public ServletRegistrationBean myServlet(){
MyServlet myServlet=new MyServlet();
return new ServletRegistrationBean(myServlet,"/hs","/hhh");
}
FilterRegistrationBean{...}
ServletListenerRegistrationBean{...}
}
定制化的常见方式
-
修改配置文件; -
xxxxxCustomizer;(修改比较底层时使用) -
编写自定义的配置类 xxxConfiguration;+ @Bean替换、增加容器中默认组件;视图解析器 -
Web应用 编写一个配置类实现 WebMvcConfigurer 即可定制化web功能;+ @Bean给容器中再扩展一些组件(常用) @Configuration
public class AdminWebConfig implements WebMvcConfigurer
-
在继承了WebMvcConfigurer的类上添加注解@Enable 可以全面接管SpringMVC,所有规则全部自己重新配置; 实现定制和扩展功能
- 原理
- 1、WebMvcAutoConfiguration 默认的SpringMVC的自动配置功能类。静态资源、欢迎页…
- 2、一旦使用 @EnableWebMvc 、。会 @Import(DelegatingWebMvcConfiguration.class)
- 3、DelegatingWebMvcConfiguration 的 作用,只保证SpringMVC最基本的使用
- 把所有系统中的 WebMvcConfigurer 拿过来。所有功能的定制都是这些 WebMvcConfigurer 合起来一起生效
- 自动配置了一些非常底层的组件。RequestMappingHandlerMapping、这些组件依赖的组件都是从容器中获取
- public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport
- 4、WebMvcAutoConfiguration 里面的配置要能生效 必须 @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
- 5、@EnableWebMvc 导致了 WebMvcAutoConfiguration 没有生效。
-
… …
|