servlet--【过滤器】

什么是过滤器?

 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过 Filter技术,对web服务器管理的所有web资源:例如Servlet, 从而实现一些 特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信 息等一些高级功能。

过滤器的作用

作用:对服务器web资源进行拦截(权限控制,通过拦截资源进行权限控制, 是否可以访问)

Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实 现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人 员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截.

过滤器中的三个方法

Filter接口是过滤器类必须实现的接口,该接口中有三个方法。

● init(FilterConfig filterConfig):该方法是对filter对象进行初始化 的方法,仅在容器初始化filter对象结束后被调用一次。参数 FilterConfig可以获得filter的初始化参数。

● doFilter(ServletRequest request, ServletResponse response, FilterChain chain):该方法是filter进行过滤操作的方法,是最重 要的方法。过滤器实现类必须实现该方法。方法体中可以对request 和response进行预处理。其中FilterChain可以将处理后的request 和response对象传递到过滤链上的下一个资源。

● destroy():该方法在容器销毁过滤器对象前被调用。

该接口类型作为Filter接口中doFilter方法的参数使用。

FilterChain接 口中有一个方法

● doFilter(ServletRequest request,ServletResponse response), 该方法可以将当前的请求和响应传递到过滤链上的下一个资源,可能 是下一个过滤器,也可能是目标资源。

过滤器案例

1.统一编码过滤器

//定义统一编码过滤器

public class EncodFilter implements Filter {

    String respencod="";
    String reqencod="";
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        reqencod= filterConfig.getInitParameter("reqencod");
        respencod=filterConfig.getInitParameter("respencod");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        servletRequest.setCharacterEncoding(reqencod);//设置请求数据编码格式
        servletResponse.setContentType(respencod);
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

2.异步请求跨域过滤器 

public class CorsFilter implements Filter {
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
        HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;

        //允许携带Cookie时不能设置为* 否则前端报错
        httpResponse.setHeader("Access-Control-Allow-Origin", httpRequest.getHeader("origin"));//允许所有请求跨域
        httpResponse.setHeader("Access-Control-Allow-Methods", "*");//允许跨域的请求方法GET, POST, HEAD 等
        httpResponse.setHeader("Access-Control-Allow-Headers", "*");//允许跨域的请求头
        httpResponse.setHeader("Access-Control-Allow-Credentials", "true");//是否携带cookie

        filterChain.doFilter(servletRequest, servletResponse);
    }

3.权限验证过滤器(adminToken  token令牌)

public class AdminTokenFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request=(HttpServletRequest) servletRequest;
        String adminToken=request.getHeader("adminToken");
        boolean res=JWTUtil.verify(adminToken);
        System.out.println(res);
        if(res){
            filterChain.doFilter(servletRequest, servletResponse);

        }else{
            Result result=new Result(401,"token验证失败,请求重新登陆",null);
            PrintWriter writer=servletResponse.getWriter();
            writer.write(new ObjectMapper().writeValueAsString(result));
        }
    }

总结(过滤器的好处)

● 过滤器用来实现通用的功能,减少代码冗余,提高可维护性

● 一个过滤器可以配置给多个资源使用

● 一个资源也可以配置多个过滤器,按照配置顺序调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值