在这里插入图片描述

过滤器的作用

    通过这个图我们可以知道,浏览器对服务器的请求会先经过过滤器再到达服务器,服务器对浏览器的响应也会先经过过滤器,最后再响应给浏览器,基于过滤器的机制我们可以在过滤器中对请求和响应做一些处理,可以在过滤器中决定是否放行,例如:校验请求中有没有敏感字符串,校验请求中有没有Session。
    Filter是依赖于Servlet容器,属于Servlet规范的一部分,Filter的执行由Servlet回调完成,Filter的生命周期由Servlet容器管理,Servlet中提供的技术可以过滤浏览器发出的请求,并且决定放行请求还是中断请求。

使用@WebFilter注解过滤

1.新建一个Model
在这里插入图片描述
2.目录结构
在这里插入图片描述
3.编写过滤器配置类(继承Filter)
init方法
在这里插入图片描述
@WebFilter注解将"/one,/two"放入到了nofilter字符串数组里,然后init方法中nofilterString将其再拿出来,判断这个字符串不为并且长度大于0,这个时候就将字符串以","分割放入到nofilter。

isNofilter方法
在这里插入图片描述

这个方法就是看请求的url过滤不过滤,不过滤返回true,过滤返回false
doFilter方法
在这里插入图片描述如果这个url是不需要过滤的,则将请求转达给下一个filter,如果没有下一个filter就是你的请求资源;如果是需要过滤的,则就将当前Servlet数据转发到/forword这个servlet

附上源码



import org.springframework.core.annotation.Order;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@Order(1)
//指定一组过滤器初始化参数
@WebFilter(initParams = {@WebInitParam(name="nofilter",value="/one,/two")})
public class FilterConfig implements Filter {
    private String[] nofilter;
    @Override
    public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
        //将不过滤的资源存入数组中,先得到nofilter的初始化参数/one,/two,然后将其以","分割放入到字符数组里
        String nofilterString=filterConfig.getInitParameter("nofilter");
        if(nofilterString!=null&&nofilterString.length()>0) {
            nofilter=nofilterString.split(",");
        }
    }



    //doFilter方法完成过滤操作,当请求发过来的时候,过滤器将执行doFilter方法
    //在HttpServletRequest 执行doFilter()之前,根据需要检查 HttpServletRequest ,
    // 同时也可以修改HttpServletRequest 请求头和数据。
    //在HttpServletResponse 执行doFilter()之后,根据需要检查 HttpServletResponse ,
    //同时也可以修改HttpServletResponse响应头和数据。
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request=(HttpServletRequest) servletRequest;
        boolean flag=isNofilter(request);
        if(flag) {
            //请求到达Servlet之前,拦截下来做预处理,处理之后便执行filterChain.doFilter(request,response),
            //这个方法将请求转达给过滤器链下一个filter,如果没有filter就是你请求的资源
            filterChain.doFilter(servletRequest,servletResponse);
        }
        else {
            // 属于转发,也是服务器跳转,相当于方法调用,
            //将当前Servlet的数据转发到forword这个servlet里
            request.getRequestDispatcher("/forword").forward(servletRequest,servletResponse);
        }
    }

    @Override
    public void destroy() {

    }
    //判断路径是否不需要过滤
    public boolean isNofilter(HttpServletRequest request) {
        //先获得请求的url
        String requestURL=request.getRequestURI();
        System.out.println(requestURL);
        //然后将请求的url打印出来
        for(String s:nofilter) {
            //与不过滤的资源进行比较
            if(requestURL.contains(s)) {
                return true;
            }
        }
        return false;
    }
}

4.编写controller类
在这里插入图片描述

5.接下来我来演示一个一个请求
在这里插入图片描述
在这里插入图片描述
/index是需要过滤的,所以执行了if else中的else,跳转到/forword Servlet。
在这里插入图片描述
在这里插入图片描述
/forword也是过滤的,会跳转到/forword

在这里插入图片描述
在这里插入图片描述

/one是不过滤的,直接访问这个页面
在这里插入图片描述
在这里插入图片描述
/two也是不过滤的,所以也是直接访问

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐