- 过滤器是拦截所有请求
- 拦截器是拦截在进入到前端控制器之后的请求
过滤器
第一种方式: 利用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、新建一个自定义异常类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 "系统忙,请稍后再试!!"; } }