1、搭建环境
2、配置文件
application.properties
application.yml
3、springboot接收请求
spring+springmvc
接收请求
响应数据
4、springboot集成jdbc
spring-boot-starter-jdbc.jar
JdbcTemplate(update|query)
5、springboot自动装配原理(重点)
1.当启动项目时,会执行@SpringbootApplication 2.该注解会启动其下的@EnableAutoConfiguration(自动装配) 3.自动装配的注解就是从 组件自动装配选择器(AutoConfigurationImportSelector)中读取组件列表 4.组件列表(META-INF/spring.factories)中就列举了众多需要进行整合的组件 5.就会找到对一个的组件类(xxxAutoConfiguration) 6.在组件类的上方就会判断当前项目是否需要与此组件整合 (@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})) 7.如果判断当前项目没有此类,则不会进行该组件的加载 8.如果判断当前项目有此类,则会读取与该组件整合的配置文件 (@EnableConfigurationProperties({DataSourceProperties.class})) 9.如果读取失败,则装配失败,项目报错 10,如果读取成功,则装配成功,springboot与该技术即整合成功
总结:整合什么技术 -- 导入该技术的jar包(场景包) -- 设置相关的属性 -- 整合成功
结论:
-
SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration;
-
每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。
-
xxxxProperties里面拿。
-
xxxProperties和配置文件进行了绑定;
-
-
生效的配置类就会给容器中装配很多组件;
-
只要容器中有这些组件,相当于这些功能就有了;
6、文件上传
表结构
create table user(
id int primary key auto_increment,
username char(32),
password char(128),
img_path char(128)
)
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserDao userDao;
@RequestMapping("/save")
public R save(User user, MultipartFile file) throws IOException {
//获取文件大小 字节数
long size = file.getSize();
System.out.println("文件大小字节数:"+size);
//保存文件到服务器(本地磁盘)
String path = "F:\\IdeaProjects\\springboot2\\src\\main\\resources\\static\\";
//获取原始文件名
String oldFileName = file.getOriginalFilename();//001.png
//获取文件后缀
String suffix = oldFileName.substring(oldFileName.lastIndexOf("."));
String newFileName = UUID.randomUUID()+ suffix;
IOUtils.copy(file.getInputStream(), new FileOutputStream(path+newFileName));
//将文件名或者(相对路径+文件名)保存到数据库表中(文件服务器,保存绝对路径到数据库表中)
user.setImgPath(newFileName);
int num = userDao.save(user);
return R.ok();
}
@Repository
public class UserDaoImpl implements UserDao{
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public int save(User user) {
String sql = "insert into user(username,password,img_path) values(?,?,?)";
return jdbcTemplate.update(sql,user.getUsername(),user.getPassword(),user.getImgPath());
}
}
7、文件下载
/*
下载文件
*/
@RequestMapping("/download")
public void download(String filename,HttpServletResponse response) throws IOException {
//根据下载的文件名,找到文件对象
File f = new File("F:\\IdeaProjects\\springboot2\\src\\main\\resources\\static\\"+filename);
InputStream in = new FileInputStream(f);
//设置响应头
response.setHeader("Content-Disposition","attachment;filename="+filename);
//从输入流,copy到输出流
IOUtils.copy(in,response.getOutputStream());
//关闭流
response.getOutputStream().close();
in.close();
}
浏览器测试:http://localhost:8080/user/download?filename=001.png
8、过滤器filter(servlet、springmvc、springboot)
过滤器是tomcat提供的api组件,用于拦截客户端发过来的所有请求(web资源),并可以对请求和响应进行一些操作。
创建过滤器
package com.hl.springboot2.config;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Map;
/*
@WebFilter 来自于servlet-api(tomcat)
springboot 默认不识别@WebFilter
*/
@WebFilter(value = {"/*"})
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("filter...init");
}
/*
每次请求都要访问
doFilter(请求对象、响应对象、过滤器链)
*/
@Override
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
System.out.println("do....filter....");
//业务逻辑
HttpServletRequest request = (HttpServletRequest) servletRequest;
//获取请求路径
StringBuffer url = request.getRequestURL();
//获取请求参数
Map map = request.getParameterMap();
//.....校验
//放行,到达目标Controller
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
System.out.println("filter..destroy");
}
}
注册过滤器
@SpringBootApplication
//@ServletComponentScan 自动扫描所有的servlet组件 例如过滤器filter @WebFilter
@ServletComponentScan
public class Springboot2Application {
public static void main(String[] args) {
SpringApplication.run(Springboot2Application.class, args);
}
}
9、拦截器Interceptor(专为springmvc设计的)
拦截器
它是springmvc提供的一个API组件,作用是用来拦截DispacherServlet发给controller的请求以及controller处理后的结果。
创建拦截器
/*
自定义的拦截器类
*/
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
System.out.println("preHandle....前置拦截.....");
return true;//true:放行 false:拦截
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandler....后置拦截......");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion.....最后执行....");
}
}
注册拦截器
@SpringBootApplication
//@ServletComponentScan 自动扫描所有的servlet组件 例如过滤器filter @WebFilter
@ServletComponentScan
public class Springboot2Application implements WebMvcConfigurer {
public static void main(String[] args) {
SpringApplication.run(Springboot2Application.class, args);
}
//配置自定义拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截路径---拦截器类
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**") //拦截路径
.excludePathPatterns("/user/download"); //排除路径(不拦截的路径)
}
}
10、重点
拦截器与过滤器的区别?
1.拦截器是基于 java 的反射机制的,而过滤器是基于函数回调。
2.拦截器不依赖与 servlet 容器,过滤器依赖与 servlet 容器。
3.拦截器只能拦截控制器,过滤器可以拦截所有的资源:Servlet,JSP,HTML。
4.拦截器在控制器的生命周期中,可以多次被调用,过滤器在所有请求调用之前。
5.拦截器可以访问控制器上下文、值栈里的对象,而过滤器不能访问。
过滤器(Filter)的使用场景
过滤器是Servlet规范的一部分,工作在Web容器层面,主要用于处理HTTP请求和响应的预处理和后处理:
-
请求/响应预处理
-
字符编码设置:统一设置请求和响应的字符编码
-
敏感词过滤:对请求参数或响应内容进行敏感词替换
-
XSS防护:过滤潜在的XSS攻击脚本
-
-
安全控制
-
权限验证:检查用户是否登录,未登录则重定向到登录页
-
IP黑名单:阻止特定IP的访问
-
HTTPS强制跳转:将HTTP请求重定向到HTTPS
-
-
日志记录
-
记录请求信息:记录请求URL、参数、耗时等
-
性能监控:记录请求处理时间
-
-
跨域处理
-
设置CORS相关响应头
-
-
压缩处理
-
对响应内容进行GZIP压缩
-
拦截器(Interceptor)的使用场景
拦截器是Spring框架提供的机制,工作在Spring MVC层面,可以访问Spring的上下文和业务对象:
-
权限验证
-
细粒度的权限控制:基于角色或权限的访问控制
-
Token验证:JWT等令牌的验证
-
-
业务逻辑处理
-
参数预处理:对Controller方法的参数进行预处理
-
结果后处理:对Controller返回的结果进行统一处理
-
-
日志记录
-
记录方法调用信息:记录Controller方法的入参、返回值
-
业务操作日志:记录用户操作
-
-
性能监控
-
记录方法执行时间
-
慢请求报警
-
-
事务管理
-
方法调用前开启事务,调用后提交或回滚
-
主要区别
特性 | 过滤器(Filter) | 拦截器(Interceptor) |
---|---|---|
工作层面 | Servlet容器层面 | Spring MVC层面 |
依赖 | Servlet API | Spring框架 |
执行顺序 | 先于拦截器执行 | 后于过滤器执行 |
访问对象 | 只能访问ServletRequest | 可以访问HandlerMethod |
异常处理 | 无法使用Spring异常处理 | 可以使用Spring异常处理 |
选择建议
-
当需要处理与Servlet API相关的底层操作时,使用过滤器
-
当需要与Spring框架深度集成,处理业务相关逻辑时,使用拦截器
-
两者可以结合使用,过滤器处理底层请求,拦截器处理业务逻辑
实际开发中,通常过滤器用于处理跨域、编码、安全等基础功能,拦截器用于处理权限、日志等业务相关功能。