package com.wtb.reggie.filter;
import com.alibaba.fastjson.JSON;
import com.wtb.reggie.common.BaseContext;
import com.wtb.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;
import javax.print.DocFlavor;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//检查用户是否完成登陆
// 过滤器
// 拦截所有请求
@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;
//获得本次请求url...
String requestURI = request.getRequestURI();
log.info("[通知][通知]拦截到请求{}", requestURI);
//不需要登陆就想要的功能
String[] urls = new String[]{
"/employee/login",
"/employee/logout",
// 下面的是静态页面
"/backend/**",
"/front/**",
"/user/sendMsg",//移动端发送短信
"/user/login"//移动端登陆
};
// 检查登陆状态
boolean check = check(urls, requestURI);
// 如果不需要处理,则直接放行
if (check) {
log.info("[通知][通知]本次请求{},不需要拦截...", requestURI);
filterChain.doFilter(request, Response);
return;
}
// 访问需要登陆的资源,
if (request.getSession().getAttribute("employee") != null) {
log.info("[通知][通知]用户已登陆,用户id为:{}", request.getSession().getAttribute("employee"));
Long employee = (Long) request.getSession().getAttribute("employee");
//
// 在用户登陆后,获取当前employee,并存入basecontext.
BaseContext.setCurrentid(employee);
// 线程类
// long id = Thread.currentThread().getId();
// log.info("线程id为:{}"+id);
filterChain.doFilter(request, Response);
return;
}
// 移动端用户的登陆
if (request.getSession().getAttribute("user") != null) {
log.info("[通知][通知]用户已登陆,用户id为:{}", request.getSession().getAttribute("user"));
Long userid = (Long) request.getSession().getAttribute("user");
//
// 在用户登陆后,获取当前employee,并存入basecontext.
BaseContext.setCurrentid(userid);
// 线程类
// long id = Thread.currentThread().getId();
// log.info("线程id为:{}"+id);
filterChain.doFilter(request, Response);
return;
}
log.info("[警告][警告]用户未登陆");
// 如果未登录,通过响应流发送响应数据(发送给前段)
Response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
log.info("拦截到请求:{}", request.getRequestURL());
return;
}
/**
* 路径匹配,检查本次请求是否需要放行
*
* @param urls
* @param requestURL
* @return
*/
public boolean check(String[] urls, String requestURL) {
//遍历
for (String url : urls) {
// 路径匹配
boolean match = PATH_MATCHER.match(url, requestURL);
if (match) {
return true;
}
}
return false;
}
}
spingboot过滤器
最新推荐文章于 2024-03-05 19:39:04 发布