- 過濾器是攔截所有請求
- 攔截器是攔截在進入到前端控制器之后的請求
過濾器
第一種方式: 利用Servlet3.0的WebFilter注解配置(推薦)
@WebFilter是Servlet3.0新增加的注解,在servlet3.0之前,我們需要在web.xml文件中進行過濾器的配置,
而現在可以通過此注解進行配置,當項目啟動時,會自動掃描自動注冊
1、創建一個過濾器:
// 相當於在web.xml文件中配置過濾器 @WebFilter(value = "/*",filterName ="AFilter" ) public class AFilter implements Filter{ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("AFilter 攔截...."); //放行 chain.doFilter(request, response); }
2、注解以外,我們還需在配置類中加另外一個注解:@ServletComponetScan,指定掃描的Filter包。
@SpringBootApplication @ServletComponentScan("com.zl.app.filter") public class SpringBoot05ThymeleafDemo2Application { public static void main(String[] args) { SpringApplication.run(SpringBoot05ThymeleafDemo2Application.class, args); }
第二種方式: 利用SpringBoot的配置類來添加過濾器
1、創建一個過濾器:(我們對上面的過濾器不進行任何改變, 而且也不需要添加@WebFilter注解)
public class AFilter implements Filter{ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("AFilter 攔截...."); //放行 chain.doFilter(request, response); }
2、創建一個配置類:我們可以使用SpringBoot提供的FilterRegistrationBean來對Filter進行配置:
@Configuration public class FilterConfig { /*過濾器注解bean: FilterRegistrationBean, 注冊過濾器, 添加過濾器*/ @Bean public FilterRegistrationBean<AFilter> createFilterRegistrationBean() { //1.創建FilterRegistrationBean這個對象, 一個過濾器注冊器,注冊一個過濾器 FilterRegistrationBean<AFilter> filterRegistrationBean = new FilterRegistrationBean<>(); //注冊一個過濾器 filterRegistrationBean.setFilter(new AFilter()); //過濾器的配置, 設置攔截的url filterRegistrationBean.addUrlPatterns("/*"); //給過濾器起名字 filterRegistrationBean.setName("AFilter"); //設置過濾器的執行順序 filterRegistrationBean.setOrder(1); return filterRegistrationBean; }
3、不需要在啟動類中添加掃描注解
這樣配置就完成了,需要配置的選項主要包括實例化Filter類,然后指定url的匹配模式,設置過濾器名稱和執行順序,這個過程和在web.xml中配置其實沒什么區別,只是形式不同而已
攔截器
1、創建一個攔截器
public class AInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("AInterceptor..."); return true; } }
2、攔截器配置類:
方法一:
@Configuration public class InterceptorConfig{ @Bean public InterceptorRegistry createInterceptorRegistry() { //創建攔截器注冊器 InterceptorRegistry interceptorRegistry = new InterceptorRegistry(); //添加攔截器 interceptorRegistry.addInterceptor(new AInterceptor()).addPathPatterns("/**"); return interceptorRegistry; } }
方法二:(推薦)
@Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { //注冊攔截器 registry.addInterceptor(new AInterceptor()).addPathPatterns("/**"); } }
全局異常處理(處理controller的異常)
- 1.新建一個全局的異常類
- 2.在class上添加注解,@ControllerAdvice
- 3.在class中添加一個方法
- 4.在方法上添加@ExceptionHandler攔截相應的異常
- 5.如果返回的是View ---方法的返回值是ModelAndView
- 6.如果返回的是String或者是JSON數據,那么需要在方法上添加@ResponseBody注解
1、新建一個自定義異常類

package com.zl.app.exception; public class MyException extends Exception { private static final long serialVersionUID = 5161867006794112122L; public MyException() { super(); } public MyException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); } public MyException(String message, Throwable cause) { super(message, cause); } public MyException(String message) { super(message); } public MyException(Throwable cause) { super(cause); } }
2、創建一個異常處理類(存放於Exception文件夾下)
在其class上注解@ControllerAdvice,在其方法上加上注解@ExceptionHandler(value=Exception.class)
@ControllerAdvice public class GlobalDefaultExceptionHandler { //編寫一個方法處理異常 表示這個方法處理所有異常 注解中的value可以省略 @ExceptionHandler(Exception.class) @ResponseBody public String allExceptionHandler(Exception e) { if(e instanceof MyException) { return e.getMessage(); } return "系統忙,請稍后再試!!"; } }