SpringBoot -05 SpringBoot web相关配置(静态资源访问、统一异常处理、文件上传、拦截器、统一跨域请求处理)

小总结 SpringBoot是一个基于Spring的工具集,去帮我们完成了大量的配置。在SpringBoot中有一个约定大于配置的概念,就是他把我们很多第三方框架帮我们写好了,而且把我们整个第三方框架所需要的依赖全都通过起步依赖加进去了。开发中只需要加入起步依赖就可以实现某个场景的开发,比如web开发场景、mybatis开发场景、Redis开发场景....

SpringBoot web相关配置:静态资源访问、统一异常处理、文件上传、拦截器、统一跨域请求处理

SpringBoot web相关配置

1 静态资源访问

Springboot工程的静态资源约定(默认)要求放在如下目录

resource

​ —/static

​ — /public

​ —/resources

​ —/META-INF/resources

优先级顺序 /META-INF/resources >>> resources >>> static >>> public

1.1 配置自定义静态资源路径

基于配置类的方式

@Configuration   // 表示当前类是一个配置类
public class MyWebConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/imag/**")//浏览器资源访问路径
                .addResourceLocations("classpath:/images/"); //映射本地资源路径
    }
}

基于配置文件的方式

spring:
  mvc:
    static-path-pattern: /images/**
  resources:
    static-locations: classpath:/images/

2 统一异常处理

SpringBoot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到请求中处理,并且该请求有一个全局的错误页面用来展示异常内容。

2.1 自定义全局处理异常

走视图解析器的配置

  • advice 底层是AOP技术 报错之后,在不修改Controller层的基础之上做增强
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public String exceptionHandle(HttpServletRequest request, Exception e){
        return "errorPage";
    }

    @ExceptionHandler(NullPointerException.class)
    public String exceptionHandle1(HttpServletRequest request, Exception e){
        //可根据不同的异常做出不同的处理
        return "errorPage1";
    }
}

前后端分离的配置(返回json数据)

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ResultData exceptionHandle(HttpServletRequest request, Exception e){
        return new ResultData(101,"出错啦!!");
    }

    @ExceptionHandler(NullPointerException.class)
    @ResponseBody
    public ResultData exceptionHandle1(HttpServletRequest request, Exception e){
        //可根据不同的异常做出不同的处理
        return new ResultData(101,"出错啦111!!");
    }
}

3 文件上传

后端Controller

注意:如果这个方法不加@ResponseBody 那么就会走视图解析器,会404

@Controller
public class UploadController {
    @RequestMapping("upload")
    //注意:如果这个方法不加@ResponseBody   那么就会走视图解析器,会404
    @ResponseBody
    public ResultData upload(@RequestParam("file")  MultipartFile file) throws IOException {
        try {
            String originalFilename = file.getOriginalFilename();
            String ext = originalFilename.substring(originalFilename.lastIndexOf("."));
            String filename = UUID.randomUUID().toString().replace("-","")+ext;
            file.transferTo(new File("D:\\workspace\\upload\\"+filename));
        } catch (Exception e) {
            e.printStackTrace();
            return new ResultData(100,"上传失败");
        }
        return new ResultData(0,"上传成功");
    }
}

文件上传配置(非必须配置)

spring:
  servlet:
    multipart:
      # 单个上传文件大小(默认1MB)
      max-file-size: 2MB
      # 总上传文件大小(默认10MB)
      max-request-size: 20MB

使用postman测试

springboot内置tomcat中配置外部访问路径

@Configuration
public class MyWebConfig implements WebMvcConfigurer {

    //添加虚拟路径,相同于通过一个路径来访问本地磁盘上的内容
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/upload/**")
                .addResourceLocations("file:D:\\workspace\\upload\\");
    }
}

4 拦截器

定义拦截器

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){
            //登录失败跳转到登录页面
            response.sendRedirect(request.getContextPath()+"/login.html");
            return false;
        }
        return true;//登录成功放行
    }
}

配置拦截器

  • 添加拦截器
  • 定义拦截器的路径
  • 定义排除拦截的路径
@Configuration
public class MyWebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor()) //添加拦截器
                .addPathPatterns("/**")  //定义拦截的路径
                .excludePathPatterns("/images");  //定义排除拦截的路径
    }
}

5 统一跨域请求处理

统一的跨域处理

@Configuration
public class MyWebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOriginPatterns("*")
                .allowedHeaders("*")
                .allowCredentials(true)
                .allowedMethods("*");
    }
}


@Configuration  //表示当前类是一个配置类
public class MyWebConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/img/**")
                .addResourceLocations("classpath:/images/");

        registry.addResourceHandler("/tupian/**")
                .addResourceLocations("file:D:\\workspace\\upload\\");
    }

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")   //请求的资源  /**表示所有资源 、
                .allowedOrigins("*")    //允许指定的源能访问
            				//  .allowedOriginPatterns("*")//允许的请求地址  一般不需要
                .allowedHeaders("*")    //允许携带的请求头
                .allowedMethods("*");    //允许的请求方式
                //.allowCredentials(true) //允许是否携带cookie

        //注意:当设置允许携带Cookie不允许将指定源设置为所有
    }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yinying293

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值