1.启动类上加上@ServletComponentScan注解
2.在自定义的过滤器类上加注解,示例代码:
package com.itheima.reggie.filter;
/**
* Created with IntelliJ IDEA.
* User: Hzy
* Time: 21:24
*/
import com.alibaba.fastjson.JSON;
import com.itheima.reggie.common.BaseContext;
import com.itheima.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;
/**
* 检查用户是否已经完成登录(拦截所有请求)
*/
@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;
//1.获取本次请求的URI
String requestURI = request.getRequestURI();
//添加不需要处理的请求路径
String[] urls = new String[]{
"/employee/login",
"/employee/logout",
"/backend/**",
"/front/**",
"/common/**",
"/user/sendMsg",
"/user/login"
};
//2.判断本次请求是否需要处理(检查登录状态)
boolean check = check(urls, requestURI);
//3.如果不需要处理,则直接放行
if (check){
//放行
filterChain.doFilter(request,response);
return;
}
//4-1.判断登录状态,如果已登录,则直接放行(后台系统)
if (request.getSession().getAttribute("employee") != null){
Long empId = (Long) request.getSession().getAttribute("employee");
BaseContext.setCurrentId(empId);
//放行
filterChain.doFilter(request,response);
return;
}
//4-2.判断登录状态,如果已登录,则直接放行(移动端)
if (request.getSession().getAttribute("user") != null){
Long userId = (Long) request.getSession().getAttribute("user");
BaseContext.setCurrentId(userId);
//放行
filterChain.doFilter(request,response);
return;
}
//5.如果未登录,则返回未登录结果,通过输出流的方式,向客户端页面响应页面
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
return;
}
/**
* 进行路径匹配,检查本次请求是否需要放行
* @param urls
* @param requestURI
* @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;
}
}