注:本文章基黑马程序员相关视频及资料进行编写,代码简单,较容易理解,若有问题或者源码资料获取可以在评论区留言或者联系作者!
文章目录
- 开篇
- 一、编写过滤器
- 总结:
开篇
前面登录功能存在的问题:
- 即使不登录,也能访问index页面;
- 如果没有的登录应该先跳转到登录有页面;
可以使用过滤器或者拦截器,在过滤器或者拦截器中判断用户是否已经完成登录,如果没有则跳转到登录页面
实现步骤:
- 创建自定义过滤器LoginCheckFilter
- 在启动类上加入注解@ServletComponentScan
- 完善过滤器的处理逻辑
一、编写过滤器
(1)新建一个LoginCheckFilter 的过滤器,对请求进行一些测试拦截,对拦截到的请求打印在控制台上面;
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")//拦截所有的请求
@Slf4j
public class LoginCheckFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;//向下转型
HttpServletResponse response = (HttpServletResponse) servletResponse;//向下转型
log.info("拦截到请求{}",request.getRequestURI());
filterChain.doFilter(request,response);
}
}
(2)在启动类上加入@ServletComponentScan注解,启动程序,控制台上能正确打印拦截到的数据;
(3)对过滤器进行具体逻辑处理与分析:
- 获取本次请求的URI
- 判断本次请求是否需要处理;
- 如果不需要处理,则直接放行;
- 判断登录状态,如果已登录,则直接放行;
- 如果未登录,则返回未登录结果;
对上面的具体逻辑分析进行完整的项目编码:
@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;//向下转型
//1. 获取本次请求的URI
String requestURI = request.getRequestURI();
log.info("本次拦截到请求{}",requestURI);
//2. 判断本次请求是否需要处理;
String[] urls = new String[]{//不需要拦截的请求
"/employee/login",
"/employee/logout",
"/backend/**",
"/fornt/**"
};
boolean check=check(urls,requestURI);
//3. 如果不需要处理,则直接放行;
if (check){
log.info("本次{}请求不需要处理",requestURI);
filterChain.doFilter(request,response);
return;
}
//4. 判断登录状态,如果已登录,则直接放行;
//对以后用户的操作进行判断,如果用户已经登录,则放行其它请求,如果没有登录,则进行拦截
if (request.getSession().getAttribute("employee")!=null){
log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee"));
filterChain.doFilter(request,response);
return;
}
log.info("用户未登录");
// 5. 如果未登录,则返回未登录结果;和前端request.js呼应 通过输出流的方式向前端返回数据
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
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;
}
}
总结:
如果感觉内容写的还不错的话,一键三连不迷路!!!!