Backgournd
During the study, here I need to make a note to remmember how to make a filter class to filter the request from the client to make actions.
Codes Display
Make a filter with 2 method to filter the url doesn’t need to protect the login situation.
import com.alibaba.fastjson.JSON;
import com.kiseki.common.BaseContext;
import com.kiseki.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;
/**
* @Description:过滤器,检查是否已经登陆
* @Author:Spike Wong
* @Date:2022/6/15
*/
@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*") //路径匹配起,支持通配符
@Slf4j
public class LoginCheckFilter implements Filter {
private 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;
//1.获取本次请求的URI
String requestURI = request.getRequestURI();
log.info("拦截到请求:{}", requestURI);
//定义不需要处理的请求路径
String[] urls = new String[]{"/employee/login", "/employee/logout", "/backend/**", "/front/**"};
//判断本次请求是否需要处理
boolean check = check(urls, requestURI);
log.info("Session的ID为:{}", request.getSession().getId());
//true说明匹配到了不需要处理的,不处理直接return
if (check) {
log.info("本次请求:{}不需要处理", requestURI);
filterChain.doFilter(request, response);
return;
}
//session 中如果不等于空,说明登陆了,也直接return不处理
if (request.getSession().getAttribute("employee") != null) {
Long employeeId = (Long) request.getSession().getAttribute("employee");
log.info("用户已登陆,本次请求不需要处理,用户id为:{}", employeeId);
BaseContext.setCurrentId(employeeId);
filterChain.doFilter(request, response);
return;
}
log.info("用户未登录");
//未登陆,则返回未登录结果,通过输出流方式向客户端页面响应数据
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
return;
}
/**
* 路径匹配,检查本次请求是否需要放行
*
* @param urls
* @param requestURI
* @return false说明没有匹配上,需要处理,true说明匹配上了,不需要处理
*/
public boolean check(String[] urls, String requestURI) {
for (String url : urls) {
boolean match = PATH_MATCHER.match(url, requestURI);
if (match) {
return true;
}
}
return false;
}
}
Set and Get id from ThreadLocal
/**
* @Description:基于ThreadLocal封装工具类,用户保存和获取当前登陆用户id
* @Author:Spike Wong
* @Date:2022/6/19
*/
public class BaseContext {
private BaseContext() {
}
private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
public static void setCurrentId(Long id) {
threadLocal.set(id);
}
public static Long getCurrentId() {
return threadLocal.get();
}
}
Mybatis-plus’s autofill variable setting
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
* @Description:元数据处理
* @Author:Spike Wong
* @Date:2022/6/19
*/
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("公共字段自动填充INSERT");
log.info(metaObject.toString());
metaObject.setValue("createTime", LocalDateTime.now());
metaObject.setValue("updateTime", LocalDateTime.now());
metaObject.setValue("createUser", BaseContext.getCurrentId());
metaObject.setValue("updateUser", BaseContext.getCurrentId());
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("公共字段自动填充Update");
log.info(metaObject.toString());
metaObject.setValue("updateTime", LocalDateTime.now());
metaObject.setValue("updateUser", BaseContext.getCurrentId());
}
}