2021-08-09

2021.8.9拦截器

拦截器实现步骤(3步)

  1. 配置好拦截器要怎么拦截,拦截后做什么 (配置一个实现了HandlerInterceptor接口的类)

  2. 将这些配置放在容器中,编写一个实现了WebMvcConfigurer的配置(所有定制web功能的配置类都必须实现WebMvcConfigurer接口)

  3. 指定拦截规则(拦截哪些请求)

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

异常处理:

  1. 默认规则

    默认情况下,SpringBoot提供/error处理所有错误的映射。

    对于机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。对于浏览器客户端,将响应一个"whitelable"错误视图,以HTML格式呈现相同的数据。

    若想对其自定义,添加View解析为error

    要完全替换默认行为,可以实现ErrorController并注册该类型的Bean定义,或添加ErrorAttribute类型的组件以使用现有机制但替换其内容。

  2. 定义错误处理逻辑

    • 自定义错误页 在templates下建一个error文件夹,放入400,500等错误页面
      • error/404.html error/5xx.html 定义为5xx就会响应所有5开头的错误,定义为500就只响应500错误
    • @ControllerAdvice+@ExceptionHandler处理异常
    • 实现HandlerExceptionResolver处理异常

Web原生组件的使用

在SpringBoot中使用servlet:

  1. 编写一个继承了HttpServlet的Servlet类,在这个类上添加@WebServlet("/xxx")
  2. 在启动类上添加@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的类上添加注解@EnableWebMvc 可以全面接管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 没有生效。
  • … …

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值