概念:
Filter是Javaweb三大组件(Servlet,Filter,Listener)之一。
过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
过滤器一般完成一些通用的操作,比如:登录校验,统一编码处理,敏感字符处理等。
步骤:
定义Filter:定义一个类,实现Filter接口,并重写其所有方法。
配置Feilter:Filter类上加@webFilter 注解,配置拦截器资源路径,引导类上加@ServletComponentScan 开启Serlet组件支持。(因为Filter是javaweb三大组件,并不是spring boot提供的功能)
放行后访问对应资源,资源访问完成后,还会回到Filter中么? 会
如果回到Filter中,是重新执行还是执行放行后的逻辑呢? 执行放行后逻辑
@WebFilter(urlPatterns = "/*")
public class Demofilter implements Filter {
@Override//初始化方法,只调用一次
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化方法执行了");
}
@Override//拦截到请求之后调用,调用多次
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Demo拦截到了请求...放行前逻辑");
//放行
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("Demo拦截到了请求...放行后逻辑");
}
@Override//销毁方法,只调用一次
public void destroy() {
System.out.println("销毁方法执行了");
}
}
拦截路径:
过滤器链:
介绍:一个web应用中,可以配置多个过滤器,这多个过滤器就形成一个过滤器链。
顺序:注解配置的Filter,优先级是按照过滤器类名(字符串)的自然排序。
登录拦截:
@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req= (HttpServletRequest) servletRequest;
HttpServletResponse resp= (HttpServletResponse) servletResponse;
//1.获取请求url
String url = req.getRequestURL().toString();
log.info("请求url:{}",url);
//判断是否是登陆操作
if(url.contains("login")){
log.info("登录操作,放行。。。");
filterChain.doFilter(servletRequest, servletResponse);
return;
}
//获取请求头中的令牌
String jwt = req.getHeader("token");
//判断jwt令牌是否存在,如果不存在,返回错误结果(未登录)
if(!StringUtils.hasLength(jwt)){
log.info("请求头为空,直接返回未登录的信息");
Result error = Result.error("NOT_LOGIN");
//手动转换 对象--json----->阿里巴巴fastJSON
String notLogin = JSONObject.toJSONString(error);
resp.getWriter().write(notLogin);//response的方法getwriter输出流,响应给浏览器
return;
}
//解析token,如果解析失败,返回错误结果(未登录)
try {
JwtUtils.parseJWT(jwt);//解析jwt令牌不报错,就是解析成功
} catch (Exception e) {//解析失败
e.printStackTrace();
log.info("解析令牌失败,返回错误结果");
Result error = Result.error("NOT_LOGIN");
//手动转换 对象--json----->阿里巴巴fastJSON
String notLogin = JSONObject.toJSONString(error);
resp.getWriter().write(notLogin);
return;
}
//放行
log.info("令牌合法,放行");
filterChain.doFilter(servletRequest, servletResponse);
}
}