瑞吉外卖项目-03过滤器完善登录

在前面项目02中,我们完成了项目登录功能的开发,但是我们发现一个问题,正常情况下我们需要登陆成功才能进入首页面,而此时我们直接输入主页面地址也可以成功访问到主页面,不满足实际需求,因此,我们需要对这一点进行改进。可使用springmvc的拦截器和javaweb阶段的过滤器实现登录拦截,我们此处使用过滤器。

在spring boot项目启动类同级目录下创建一个软件包,在包下创建一个继承了Filter的类(类名可以随意,注意继承时不要导错包,应为 import javax.servlet.*;)

需要实现其中的一个方法,并将方法形参中的两个参数进行强转,以便后文中对Session的操作

 接下来我们需要进行业务的实现,首先我们梳理一下实现流程,对于访问路径中,有些需要我们进行过滤,而有些并不需要可以直接放行,对于那些可以直接放行的路径,我们可以定义一个String数组,将这些路径都放进去,后面的操作中就可以将前端请求地址与这个数组中存放的路径做对比,如果有一样的,证明不需要拦截,就可以直接放行

  //1、获取本次请求的URI
        String requestURI = request.getRequestURI();// /backend/index.html

        log.info("拦截到请求:{}",requestURI);

        //定义不需要处理的请求路径
        String[] urls = new String[]{
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        };

因此我们需要写一个前端请求地址与这个数组中存放的路径做对比的方法,设置返回值为boollean,

方法中的PATH_MATCHER为我们在这个类中定义的一个静态参数,为一个AntPathMatcher对象

AntPathMatcher用法:

使用通配符进行匹配

?匹配一个字符(matches one character)。
*  匹配0个或者多个字符 ( matches zero or more characters)。
** 匹配url中的0个或多个子目录 (matches zero or more directories in a path)
{spring:[a-z]+} 匹配满足正则表达式[a-z]+的路径,这些路径赋值给变量"spring" (matches the regexp [a-z]+ as a path variable named "spring")
用例:

1. /erb/contract/?est.json 匹配/erb/contract/test.json、/erb/contract/aest.json、/erb/contract/best.json, 但不匹配/erb/contract/est.json ;

2. /erb/contract/*.json 匹配以.json的路径,/erb/contract/a.json、/erb/contract/ab.json、/erb/contract/abcXXX.json

3. /erb/contract/*  匹配以 /erb/contract/开始的路径,但只能是一级,/erb/contract/a、/erb/contract/abXXX、/erb/contract/a.json、/erb/contract/abXX.json、/erb/contract/a.do、/erb/contract/abXX.do 等

4.  /**/contract/** ,只要路径含有contract就可以匹配,比如:/erb/XXX/contract/a/b/XX、/erb/XXX/contract/a/b/XX.XX 

5. /**/{contract:[a-z,A-Z]+}/**, 比如:/erb/XXX/contract/a/b/XX、/erb/XXX/contractXXX/a/b/XX.XX
 

    /**
     * 路径匹配,检查本次请求是否需要放行
     * @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;
    }

 

 此方法写完之后,我们便可以调用其方法做判断,如果返回true,证明请求路径不需要过滤,可直接放行

  //3、如果不需要处理,则直接放行
        if(check){
            log.info("本次请求{}不需要处理",requestURI);
            filterChain.doFilter(request,response);
            return;
        }

除了此种情况,我们还需要判断是否是已经登陆的状态,如果是已经登陆的,我们也不需要进行拦截,此时我们通过登陆时传入session中的值来做判断,如果里面的值为空,则证明是未登录状态,反之则是登陆状态

     //4、判断登录状态,如果已登录,则直接放行
        if(request.getSession().getAttribute("employee") != null){
            log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee"));
            filterChain.doFilter(request,response);
            return;
        }

        log.info("用户未登录");

如果未登录,则需要调用R类中的error方法,给其传入形式参数“NOTLOGIN”,传入此参数是因为在后台登陆页面中的一个js文件对其msg的值进行了限制,如下图,res.data.msg==='NOTLOGIN'

即传入的形参值为NOTLOGIN时js文件中的if判断才会执行,才可进行页面跳转

 

 //5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        return;

此时,我们的业务逻辑代码便已经拜谢完毕,但是现在过滤器还不会生效,我们需要在这个过滤器类上面加上@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")注解,filtername是给这个类定义一个名字,uripattern是指定了过滤器过滤的路径,/*即为所有路径,

还需要在spring boot启动类上面加一个@ServletComponentScan注解,用来扫描到这个过滤器

 

 到此,我们的过滤器就可以正常运行了

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值