SpringBoot项目中添加过滤器Filter失效--校验是否登录

本文介绍了如何在JavaWeb项目中使用Filter进行接口权限校验,包括定义Filter、配置拦截路径,以及在SpringBoot中确保Filter生效的注意事项。作者分享了自己在实际项目中的错误示范和解决方案。
摘要由CSDN通过智能技术生成

今天在写项目的时候发现了一个问题,像一些接口的权限校验我,应该怎么实现呢?校验权限就需要在数据走到接口之前就需要进行校验,但是我应该怎么进行对接口之前进行数据处理呢?这里我们就需要说到一个功能,在Web类相关功能中大家一定会碰到,就是Filter过滤器的使用

一:概述

Filter 表示过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。Servlet 我们之前都已经学习过了,Filter和Listener 我们今天都会进行学习。

过滤器可以把对资源的请求==拦截==下来,从而实现一些特殊的功能。

浏览器可以访问服务器上的所有的资源(servlet、jsp、html等)

而在访问到这些资源之前可以使过滤器拦截来下,也就是说在访问资源之前会先经过 Filter,如下图

二:快速入门

进行 Filter 开发分成以下三步实现

  • 定义类,实现 Filter接口,并重写其所有方法

配置Filter拦截资源的路径:在类上定义 @WebFilter 注解。而注解的 value 属性值 /* 表示拦截所有的资源  

在doFilter方法中输出一句话,并放行  

Filter在拦截路径的配置

拦截路径表示 Filter 会对请求的哪些资源进行拦截,使用 @WebFilter 注解进行配置。如:@WebFilter("拦截路径")

拦截路径有如下四种配置方式:

  • 拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截

  • 目录拦截:/user/*:访问/user下的所有资源,都会被拦截

  • 后缀名拦截:*.jsp:访问后缀名为jsp的资源,都会被拦截

  • 拦截所有:/*:访问所有资源,都会被拦截

 三:我的错误示范SpringBoot中通过上述方法使用Filter但是未生效--校验是否登录

 1.在springBoot项目中同样可以利用SpringMVC的方法进行静态资源访问

2.为了避免未登录的用户也可以访问我的管理页面,我们就可以在过滤器中进行限制,如果登录过了就进行放行,否则就让提示错误信息.

@WebFilter("/*")
@Slf4j
public class ProjectFilter implements Filter {
    public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        //将这些静态资源需要放行
        String[] urls = {"/employee/login"
                , "/employee/logout"
                , "/backend/**"
                , "/front/**"
                , "/common/upload"
                , "/common/download"
                , "/user/sendMsg"
                , "/user/login"};
        for (String url : urls) {
            if (PATH_MATCHER.match(url, req.getRequestURI())) {
                //放行
                chain.doFilter(request, response);
                return;
            }
        }
        //判断是否登陆过
        HttpSession session = req.getSession();
        if (session.getAttribute("Employee") != null) {
            //已经登陆过了直接放行
            Long employee = (Long) session.getAttribute("Employee");
            //将员工id存放在ThreadLoacd中,便于后期使用
            ThreadLocalUtil.set(employee);
            return;
        }
        if (session.getAttribute("User") != null) {
            //已经登陆过了直接放行
            Long user = (Long) session.getAttribute("User");
            //将员工id存放在ThreadLoacd中,便于后期使用
            ThreadLocalUtil.set(user);
            return;
        }
        //未登录
        log.info("用户未登录!");
        resp.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        return;
    }
}

3.但是发现并没有生效,当我注释掉静态资源发现依然可以访问,简直就是没有生效,最终发现了原因,在SpringBoot项目加入过滤器还需要在启动类加上@ServletComponentScanc才可以生效

加上上面的注解才将一些东西过滤掉,完成Demo

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值