|
|
@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
package com.zhiyun.zhiyun03.filter;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import com.alibaba.fastjson2.JSON;
|
|
|
|
|
|
|
|
import com.zhiyun.zhiyun03.utils.common.JsonResult;
|
|
|
|
|
|
|
|
import com.zhiyun.zhiyun03.utils.common.ResultCode;
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* @description: 检查用户是否已经完成登录
|
|
|
|
|
|
|
|
* @author: Jie
|
|
|
|
|
|
|
|
* @date: 2022/8/10 9:48
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
|
|
|
@WebFilter(filterName = "LoginCheckFilter", urlPatterns = "/*")
|
|
|
|
|
|
|
|
@Slf4j
|
|
|
|
|
|
|
|
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("拦截到请求,{}", requestURI);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//2、判断本次请求是否需要处理
|
|
|
|
|
|
|
|
//定义不需要处理的请求路径
|
|
|
|
|
|
|
|
String[] urls = new String[]{
|
|
|
|
|
|
|
|
"/user/login",
|
|
|
|
|
|
|
|
"/user/logout",
|
|
|
|
|
|
|
|
"/layui/**",
|
|
|
|
|
|
|
|
"/front/**"
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
boolean check = check(urls, requestURI);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//3、如果不需要处理,则直接放行
|
|
|
|
|
|
|
|
if (check) {
|
|
|
|
|
|
|
|
log.info("本次请求{}不需要处理", requestURI);
|
|
|
|
|
|
|
|
filterChain.doFilter(request, response);
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//取出token
|
|
|
|
|
|
|
|
String token = request.getHeader("token");
|
|
|
|
|
|
|
|
//第一次登录没有token,给null会报错,所以我们判断一下token是否为空,为空给一个空串
|
|
|
|
|
|
|
|
//三元运算
|
|
|
|
|
|
|
|
token = token==null?"":token;
|
|
|
|
|
|
|
|
//4、判断登录状态,如果已登录,则直接放行
|
|
|
|
|
|
|
|
if (token!= null) {
|
|
|
|
|
|
|
|
// log.info("用户已登录,用户id为:{}", request.getSession().getAttribute("USER"));
|
|
|
|
|
|
|
|
filterChain.doFilter(request, response);
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
log.info("用户未登录");
|
|
|
|
|
|
|
|
//5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
|
|
|
|
|
|
|
|
response.getWriter().write(JSON.toJSONString(JsonResult.error(ResultCode.ERROR,"用户未登录")));
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public boolean check(String[] urls, String requestURI) {
|
|
|
|
|
|
|
|
for (String url : urls) {
|
|
|
|
|
|
|
|
boolean match = PATH_MATCHER.match(url, requestURI);
|
|
|
|
|
|
|
|
if (match) {
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|