2022-10-14过滤器Filter

思路

  • 定义不需要拦截的路径
  • 将获取的路径与定义的比较,来查看这个请求路径是否需要拦截
  • 拦截进行处理

在springboot下使用过滤器

1.定义过滤器类,并实现Filter接口,在类上面写上@WebFilter(urlPatterns = “/*”)

  • 引申一个问题:/*表示什么?
  • 问题解决:urlPatterns 为拦截路径,/* 默认过滤所有(也可过滤html),不能写成/**
    2.实现doFilter方法
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();

  • 引深一个问题:URI是什么?
  • 问题的解决:URL是URI的子集,Web上的每一种资源如:图片、文档、视频等,都是由URI定位的,这里定位指的是web上的资源相对于主机服务器来说,存放在服务器上的具体路径。URI就是一种资源定位机制,它是比较笼统地定位了资源,并不局限于客户端和服务器,而URL就定位了网上的一切资源,只要是网上的资源,都有唯一的URL.

3.定义不需要处理的请求路径

        String[] urls = new String[]{
                //需要放行的动态资源
                "/employee/login",
                //这个路径是点击登录按钮请求的路径,所有人家本来就是来登陆的,你不需要拦截
                "/employee/logout",//用户点击退出按钮也不需要处理的
                //静态资源都进行放行,因为我们只是拦截controller的请求,对于静态资源的请求看见也没事
                "/backend/**",
                "/front/**"
         };

4.判断本次请求是否需要处理,即检查我们的请求路径如果在urls中就不处理

//路径匹配器,支持通配符,就可以查看我们此次请求的路径是否匹配我们的拦截路径
 AntPathMatcher antPathMatcher =new AntPathMatcher();
 boolean check = check(urls, requestURI);
  //3、如果不需要处理,则直接放行
        if(check){//返回true
            log.info("本次请求{}不需要处理",requestURI);
            filterChain.doFilter(request,response);
            return;//放行就不需要处理了,让方法结束
        }
 public boolean check(String[] urls,String requestURI){
        for (String url : urls) {
            boolean match = antPathMatcher.match(url, requestURI);
            if(match){
                return true;
            }
        }
        return false;
    }
  • 引申一个问题:if(check)表示什么?
  • 问题的解答:当if里面写的就是boolean变量的时候,就是true的意思
  • 注意一个问题: filterChain.doFilter(request,response);语句表示放行

5.如果已登录,则直接放行

 if(request.getSession().getAttribute("employee") != null){
            Long empId = (Long) request.getSession().getAttribute("employee");
            BaseContext.setCurrentId(empId);
            filterChain.doFilter(request,response);//放行
            return;
        }

6.如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据,前端页面负责跳转到登录页面

 response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        return;

前端页面是这样写的image.png
7.最后注意点: 需要在启动类上添加@ServletComponentScan
这样才会扫描到@WebFilter(urlPatterns = “/*”)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值