目录
- 4、拦截器
- 5、过滤器
- 5.1、介绍
- 5.2、使用
4、拦截器
依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,拦截器可以调用IOC容器中的各种依赖,而过滤器不能,因此可以使用Spring的依赖注入进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能,但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。
在 Spring Boot 项目中,使用拦截器功能通常需要以下 3 步:
- 带入相关依赖:spring-boot-starter-web 启动器会引入相关依赖
- 创建一个登录拦截器实现 HandlerInterceptor接口,让在访问规定页面时用户必须登录
返回值类型 | 方法声明 | 描述 |
boolean | preHandle® | 在控制器处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。 |
void | postHandle() | 在控制器处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步修改。 |
void | afterCompletion() | 该方法在视图渲染结束后执行,可以通过此方法实现资源清理、记录日志信息等工作。 |
@Slf4j
public class MyLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object loginUser = request.getSession().getAttribute("loginUser");
if (loginUser == null) {
//未登录,返回登陆页
request.setAttribute("msg", "您没有权限进行此操作,请先登陆!");
request.getRequestDispatcher("/login.html").forward(request, response);
return false;
} else {
//放行
return true;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("======在方法处理完逻辑,渲染视图之前执行========");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("======在视图渲染完之后执行,用于资源清理等等=======");
}
}
- 注册拦截器,指定拦截规则(如果是拦截所有,静态资源也会被拦截)。
@Configuration
@Slf4j
public class InterseptorConfig implements WebMvcConfigurer {
@Bean
public MyLoginInterceptor myLoginInterceptor(){
return new MyLoginInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
log.info("注册拦截器");
registry.addInterceptor(myInterseptor())
.addPathPatterns( //拦截的路径,
//拦截所有请求,包括静态资源文件
new LoginInterceptor()).addPathPatterns("/**")
)
.excludePathPatterns( //不拦截的路径,静态资源、登录等
"/", "/login", "/index.html", "/user/login", "/css/**", "/images/**", "/js/**", "/fonts/**"
);
}
}
5、过滤器
5.1、介绍
Filter:过滤器,JavaWeb 的三大组件之一。属于JavaEE 的规范,是javax.servlet.Filter接口。
过滤器的主要作用是:拦截请求、过滤响应。常见的应用场景为:权限检查、日记操作、处理不合法数据,统一进行编码设置…等。
SpringBoot是利用@WebFilter配置Filter
- @WebFilter常用属性
属性 | 类型 | 是否必需 | 说明 |
asyncSupported | boolean | 否 | 指定Filter是否支持异步模式 |
dispatcherTypes | DispatcherType[] | 否 | 指定Filter对哪种方式的请求进行过滤。 支持的属性:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST; 默认过滤所有方式的请求 |
filterName | String | 否 | Filter名称 |
initParams | WebInitParam[] | 否 | 配置参数 |
displayName | String | 否 | Filter显示名 |
servletNames | String[] | 否 | 指定对哪些Servlet进行过滤 |
urlPatterns/value | String[] | 否 | 两个属性作用相同,指定拦截的路径 |
过滤器的urlPatterns的过滤路径规则:
1.全路径匹配: /abc/myServlet1.do
2.部分路径匹配: /abc/*
3.通配符匹配 :/*
4.后缀名匹配 :*.do
- @Order(1) //指定过滤器的执行顺序,值越大越靠后执行
5.2、使用
- 创建过滤器
@Slf4j
//声明是一个过滤器,需要过滤"/login/* 下的所有接口"
@WebFilter(urlPatterns = "/login/*",filterName = "MyFilter")
@Order(1) //指定过滤器的执行顺序,值越大越靠后执行
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("=====Filter初始化=====");
}
//执行过滤的规则
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//过滤编码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获取请求的一些参数
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String uri = httpServletRequest.getRequestURI();
String method = httpServletRequest.getMethod();
log.info("请求的接口{},请求的方式{}",uri,method);
//放行的作用,如果没有,程序会卡在这步,不能继续执行
chain.doFilter(request,response);
}
@Override
public void destroy() {
log.info("=====Filter被销毁=====");
}
}
- 在springboot启动类上添加注解:@ServletComponentScan
@SpringBootApplication
@EnableScheduling //开启对定时任务的支持
@ServletComponentScan //Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。
public class SpringbootdemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootdemoApplication.class, args);
}
}
- 先进入filter