创建过滤器
1.创建过滤器类,并且实现过滤器接口(Filter)
2.使用@WebFilter(filterName = “loginCheckFilter”,urlPatterns = “/*”),filterName:过滤器名字,urlPatterns :被拦截的路径
3.实现 Filter 的默认方法doFilter
使用过滤器
在项目启动类中添加注解:@ServletComponentScan
最终代码区:
package com.yiwen.reggie.filter;
import com.alibaba.fastjson.JSON;
import com.yiwen.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 拦截器的使用,拦截所有路径的请求,都需要经过此拦截器
*/
@Slf4j
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
//路径匹配器
public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
//获取请求路径
String requestURI = request.getRequestURI();
log.info("初始拦截请求:{}",request.getRequestURI());
//创建需要放行的路径
String[] urls = new String[]{
"/employee/login",
"/employee",
"/employee/out",
"/employee/page",
"/backend/**",
"/front/**"
};
//判断本次是否需要拦截,里面使用Spring的路径对比器
boolean check = check(requestURI, urls);
if (check){
//放行
filterChain.doFilter(request,response);
log.info("不需要拦截:{}",requestURI);
return;
}
//如果已经登录则放行
if (request.getSession().getAttribute("employee") != null) {
//放行
filterChain.doFilter(request,response);
log.info("用户:{},已登录。",request.getSession().getAttribute("employee"));
return;
}
//如果未登录则返回登录结果,通过输出流向客户端返回数据
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
log.info("未登录拦截路径:{}",request.getRequestURI());
return;
}
/**
* 使用Spring的路径匹配器来对比路径是否正确
* @param requestUrI
* @param urls
* @return
*/
public boolean check(String requestUrI,String[] urls){
for (String url : urls) {
if (PATH_MATCHER.match(url,requestUrI)) {
return true;
}
}
return false;
}
}