过滤器(springboot)
实现步骤:
1、创建自定义过滤器LoginCheckFilter
2、在启动类上加入注解@ServletComponentScan
3、完善过滤器的处理逻辑
②:定义Spring管理的类(接口)
1 2 3 4 5 6 7 8 9 | @Slf4j @SpringBootApplication @ServletComponentScan public class ReggieApplication { public static void main(String[] args) { SpringApplication.run(ReggieApplication. class ,args); log.info( "项目启动成功..." ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | package com.po.reggie.filter; import com.alibaba.fastjson.JSON; import com.po.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 = "/*" ) @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(); // /backend/index.html log.info( "拦截到请求:{}" ,requestURI); //定义不需要处理的请求路径 String[] urls = new String[]{ "/employee/login" , "/employee/logout" , "/backend/**" , "/front/**" , "/common/**" , "/user/sendMsg" , "/user/login" }; //2、判断本次请求是否需要处理 boolean check = check(urls, requestURI); //3、如果不需要处理,则直接放行 if (check){ log.info( "本次请求{}不需要处理" ,requestURI); filterChain.doFilter(request,response); return ; } //4-1、判断登录状态,如果已登录,则直接放行 if (request.getSession().getAttribute( "employee" ) != null ){ log.info( "用户已登录,用户id为:{}" ,request.getSession().getAttribute( "employee" )); Long empId = (Long) request.getSession().getAttribute( "employee" ); // BaseContext.setCurrentId(empId); filterChain.doFilter(request,response); return ; } //4-2、判断登录状态,如果已登录,则直接放行 // if(request.getSession().getAttribute("user") != null){ // log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("user")); // Long userId = (Long) request.getSession().getAttribute("user"); // BaseContext.setCurrentId(userId); // filterChain.doFilter(request,response); // return; // } log.info( "用户未登录" ); //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 ; } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY