过滤器(Filter)
过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理。通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理
springboot项目中实现过滤器的两种方式:
1.注解 @WebFilter
2.配置类
本项目目标:过滤器对于前端模拟登录的请求,判断其name参数是user或者admin,则登陆成功。
第一种:注解 @WebFilter实现过滤器
项目结构如图:(先不关注MyFilterConfig类,这是配置类,下面第二种实现方式会用到)
- 启动类:TestFilterApplication
- 控制层:MyController(两个模拟登录接口)
- 过滤器:MyFilter
1.1、准备工作:创建启动类,配置文件,引如依赖
依赖就一个:spring-boot-starter-web
,里面包含了filter的包,不需要单独引入了
filter在tomcat的包里:
依赖spring-boot-starter-web
:
<!--web的起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
1.2、控制层:MyController.class
模拟登录:
package com.tzq.testFilter.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author tangzhiqian
* @CreateTime 2021/6/9 13:40
*/
@RestController
@RequestMapping("/login")
public class MyController {
@GetMapping("/user")
public String userLogin(String name){
return name+"登陸成功!!!";
}
@GetMapping("/admin")
public String adminLogin(String name){
return name+"登陸成功!!!";
}
}
1.3、新建过滤器Filter类
主要是 利用注解来实现:
@WebFilter(urlPatterns = “/login/*”, filterName = “MyTestFilter”)
package com.tzq.testFilter.filter;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* @Author tangzhiqian
* @CreateTime 2021/6/9 13:29
*/
@WebFilter(urlPatterns = "/login/*", filterName = "MyTestFilter")
@Component
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
String name = request.getParameter("name");
if ("user".equals(name) || "admin".equals(name)) {
System.out.println("登錄成功!!!");
filterChain.doFilter(servletRequest, servletResponse);
} else {
System.out.println("登錄失敗");
}
}
}
Filter解释:
到这里,过滤器就建好了
1.4、运行
运行:http://localhost:8076/login/admin?name=admin
运行:http://localhost:8076/login/admin?name=aaa
name参数为admin,登录成功!参数为aaa,空白,登录失败!
第二种:配置类实现过滤器
使用配置类的时候,我把注解@WebFilter
注释掉!
新建配置类:MyFilterConfig.class
package com.tzq.testFilter.filter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
/**
* @Author tangzhiqian
* @CreateTime 2021/6/9 15:25
*/
@Configuration
public class MyFilterConfig {
@Bean
FilterRegistrationBean myFilterRegistration() {
//创建配置bean对象,并指定->过滤器
FilterRegistrationBean registration = new FilterRegistrationBean(new MyFilter());
List<String> urlPatterns = new ArrayList<>();
urlPatterns.add("/login/*");
//添加需要过滤的url
registration.setUrlPatterns(urlPatterns);
return registration;
}
}
MyFilterConfig代码解析:
经测试,同样可以实现过滤器!