在没有拦截器拦截前端请求的情况下,即使用户不进行登录,却依然能够进入系统。这显然是不合理的。这里使用拦截器对其请求进行一个拦截并且过滤。将那些需要需要用户登录才能够展示的界面进行一个拦截,如果用户没有登录,就需要跳转到登录界面进行登录。
没有拦截器的效果展示
此时我们没有登录,但是在访问http://localhost:8080/backend/index.html时依然可以成功访问。
添加拦截器的思路分析
在未登录的情况下需要返回什么信息,需要结合前端的处理。如下图所示,如果未登录,需要给前端传一个"NOTLOGIN"。
代码实现
自定义过滤器:自定义一个过滤器 LoginCheckFilter 并实现 Filter 接口, 在doFilter方法中完成校验的逻辑。
点击查看代码
@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();
//定义不需要拦截的路径
List<String> noFilterUris = new ArrayList<>();
noFilterUris.add("/employee/login");
noFilterUris.add("/employee/logout");
noFilterUris.add("/backend/**");
noFilterUris.add("/front/**");
//判断本次请求是否需要被拦截
for (int i = 0; i < noFilterUris.size(); i++) {
String noFilterUri = noFilterUris.get(i);
if (PATH_MATCHER.match(noFilterUri,requestURI)){
log.info("本次请求不需要处理--->"+requestURI);
filterChain.doFilter(request,response);
return;
}
}
//判断用户是否登录
if (request.getSession().getAttribute("employee")!=null){
log.info("用户已登录");
filterChain.doFilter(request,response);
return;
}
//用户未登录,通过输出流的方式向客户端页面响应数据
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
return;
}
}
AntPathMatcher 拓展:
介绍: Spring中提供的路径匹配器 ;