• SpringBoot实现登录拦截


    如果我们不进行登录拦截的话,即使我们跳过登录页面直接去访问任意一个页面也能访问成功,那么登录功能就没有意义,同时也会存在安全问题,因为有些操作是要用户登录后才能执行的,如果用户没有登录,该接口就获取不了当前访问的用户也就不知道是哪个用户执行了该操作就会出错。所以我们要进行登录判断,如果没有登录则访问任意页面都跳转到登录页面。

    代码实现

    1. 创建自定义过滤器LoginCheckFilter
    2. 在启动类上加入注解@ServletComponentScan,才会去扫描过滤器
    3. 完善过滤器的处理逻辑

    具体实现:

    使用过滤器或者拦截器,在过滤器或者拦截器中判断用户是否已经完成登录,如果没有登录则跳转到登录页面。如果登录了或者该请求不需要登录拦截器直接放行,交由具体的controller进行处理。
    LoginCheckFilter

    package com.zxy.filter;
    
    //urlPatterns配置拦截路径,这里表示拦截所有
    @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();
    
            //定义不需要处理的请求路径,下面的*只是字符串,并不是通配符,后面通过check判断时*号就视为通配符了
            String[] urls = new String[]{
                    "/employee/login",
                    "/employee/logout",
                    "/backend/**",
                    "/front/**"
            };
            //2.判断本次请求是否需要处理
            boolean check = check(urls,requestURI);
    
            //3.如果不需要处理,直接放行
            if(check){
                filterChain.doFilter(request,response);
                return;
            }
            //4.如果需要处理,判断是否登录
            //登录状态,不需要处理,直接放行
            if(request.getSession().getAttribute("employee")!=null){
    
                filterChain.doFilter(request,response);
                return;
            }
            //5.如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据,因为我们返回的是void,所以不能return R.error("NOTLOGIN")
            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;
        }
    }
    
    • 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
  • 相关阅读:
    雅思核心词拾遗01----Politics + Culture
    2023研究生数学建模竞赛A题B题C题D题E题F题思路+模型+代码
    WebSocket开发web页面与服务实时通信
    深度解析Socks5代理与IP代理的网络应用
    【网络工程】5、路由器介绍及配置实操
    应用系统设计:预约挂号平台,B2C平台设计
    SpringBoot入门
    【论文解读】GPT Understands, Too
    油管125万粉顶级交易员_教你使用macd
    【毕业设计】深度学习卫星遥感图像检测与识别 -opencv python 目标检测
  • 原文地址:https://blog.csdn.net/m0_53951384/article/details/132714633