小总结 SpringBoot是一个基于Spring的工具集,去帮我们完成了大量的配置。在SpringBoot中有一个约定大于配置的概念,就是他把我们很多第三方框架帮我们写好了,而且把我们整个第三方框架所需要的依赖全都通过起步依赖加进去了。开发中只需要加入起步依赖就可以实现某个场景的开发,比如web开发场景、mybatis开发场景、Redis开发场景....
SpringBoot web相关配置:静态资源访问、统一异常处理、文件上传、拦截器、统一跨域请求处理
- SpringBoot web相关配置
- 1 静态资源访问
- 1.1 配置自定义静态资源路径
- 2 统一异常处理
- 2.1 自定义全局处理异常
- 3 文件上传
- 4 拦截器
- 5 统一跨域请求处理
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 {@Overridepublic 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)@ResponseBodypublic ResultData exceptionHandle(HttpServletRequest request, Exception e){return new ResultData(101,"出错啦!!");}@ExceptionHandler(NullPointerException.class)@ResponseBodypublic ResultData exceptionHandle1(HttpServletRequest request, Exception e){//可根据不同的异常做出不同的处理return new ResultData(101,"出错啦111!!");}
}
3 文件上传
后端Controller
注意:如果这个方法不加@ResponseBody 那么就会走视图解析器,会404
@Controller
public class UploadController {@RequestMapping("upload")//注意:如果这个方法不加@ResponseBody 那么就会走视图解析器,会404@ResponseBodypublic 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 {//添加虚拟路径,相同于通过一个路径来访问本地磁盘上的内容@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/upload/**").addResourceLocations("file:D:\\workspace\\upload\\");}
}
4 拦截器
定义拦截器
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic 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 {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()) //添加拦截器.addPathPatterns("/**") //定义拦截的路径.excludePathPatterns("/images"); //定义排除拦截的路径}
}
5 统一跨域请求处理
统一的跨域处理
@Configuration
public class MyWebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOriginPatterns("*").allowedHeaders("*").allowCredentials(true).allowedMethods("*");}
}@Configuration //表示当前类是一个配置类
public class MyWebConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/img/**").addResourceLocations("classpath:/images/");registry.addResourceHandler("/tupian/**").addResourceLocations("file:D:\\workspace\\upload\\");}@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") //请求的资源 /**表示所有资源 、.allowedOrigins("*") //允许指定的源能访问// .allowedOriginPatterns("*")//允许的请求地址 一般不需要.allowedHeaders("*") //允许携带的请求头.allowedMethods("*"); //允许的请求方式//.allowCredentials(true) //允许是否携带cookie//注意:当设置允许携带Cookie不允许将指定源设置为所有}
}