开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情
简介
SpringBoot是Pivotal团队提供的全新框架,其设计目的来简化Spring应用的初始搭建以及开发过程。
springboot的创建
创建一个SpringBoot
我们首先创建一个项目,然后在项目结构中加入Maven,然后选择Spring Initializr,接下来我们选择版本这里我们选择java 8,因为本人是JDK 8,当然有高版本的也可以选择高版本的SpringBoot版本。
做一个实验小Demo
注意,我们刚创建完SpringBoot项目可能会出现Java目录不是蓝色而是灰色的!!!!噫?难道SpringBoot比较独特的设置吗?
我们右键创建一个Class试试,咦?为什么没有创建类这个选项????
原来是我们用idea创建其后会自动把依赖包导入,这也是为什么SpringBoot创立时必须要联网操作,这需要一定的时间,所以此时无法识别文件。
右下角可以看到进度。
在Springboot中使用拦截器和过滤器
在 Spring Boot 中实现过滤器和拦截器非常简单,只需要实现相应的接口并添加 @Component 注解即可将其作为 Spring 的 Bean 进行管理。
过滤器:
要在 Spring Boot 中实现过滤器,需要实现 javax.servlet.Filter 接口,并重写其中的 doFilter 方法。例如,以下是一个简单的过滤器,用于在处理请求之前打印出当前时间:
@Component
public class ExampleFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
long startTime = System.currentTimeMillis();
System.out.println("Start Time: " + startTime);
chain.doFilter(request, response);
long endTime = System.currentTimeMillis();
System.out.println("End Time: " + endTime);
System.out.println("Time Taken: " + (endTime - startTime));
}
}
拦截器:
要在 Spring Boot 中实现拦截器,需要实现 org.springframework.web.servlet.HandlerInterceptor 接口,并重写其中的 preHandle、postHandle 和 afterCompletion 方法。例如,以下是一个简单的拦截器,用于在处理请求之前打印出当前时间:
@Component
public class ExampleInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
long startTime = System.currentTimeMillis();
request.setAttribute("startTime", startTime);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
long startTime = (Long) request.getAttribute("startTime");
request.removeAttribute("startTime");
long endTime = System.currentTimeMillis();
modelAndView.addObject("handlingTime", endTime - startTime);
}
}
在拦截器中,afterCompletion 方法会在整个请求结束之后,也就是在视图渲染之后调用。这是一个很好的地方,可以用来清理资源或记录一些信息。
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// ...
}
如果你希望拦截器应用于所有的请求,你需要在你的 Spring Boot 应用中配置拦截器。你可以通过实现 WebMvcConfigurer 接口并重写 addInterceptors 方法来完成这一点。
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private ExampleInterceptor exampleInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(exampleInterceptor);
}
}
一些小区别
过滤器和拦截器都可以用于对请求进行预处理和后处理,但是它们之间有一些区别:
- 过滤器位于 Servlet API 层,而拦截器位于 Spring MVC 层。
- 过滤器可以对所有类型的请求起作用,而拦截器仅限于处理器映射(handler mapping)。
- 过滤器没有访问控制器的能力,而拦截器可以访问控制器和模型视图对象。