IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 2021-08-09 -> 正文阅读

[Java知识库]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的类上添加注解@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 没有生效。
  • … …

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:17:12  更:2021-08-10 13:18:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:19:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码