网络传输-过滤器

Web过滤器

例子:访问网站的时候,访问一些需要登陆的内容时会自动跳转到登陆界面,这就是常见的身份验证的安全控制过滤器。

过滤器的作用:

       实现对web资源请求的拦截,完成特殊的操作,尤其是对请求的预处理。
web资源包括{JSP,Servlet,图片,文件}

过滤器常见的应用场景:

        Web资源权限访问控制
        请求字符集编码处理
        内容敏感字符词汇过滤
        响应信息压缩

工作流程:

                           |过滤器|
        客户端 -> 请求预处理 -> servlet.service()
        客户端 <- 响应后处理 <- servlet.service()

过滤器的生命周期:

        web应用程序启动时,web服务器创建Filter的实例对象,以及对象的初始化
        当请求访问与过滤器关联的web资源时,过滤器拦截请求,完成指定功能。
        Filter对象创建后回驻留在内存,在web应用移除或服务器停止时才销毁
        过滤器的创建和销毁有WEB服务器负责

过滤器的实现步骤:

        1. 编写java类实现Filter接口,并实现其doFilter方法
        2. 在web.xml 文件中对Filter类进行注册,并设置所拦截的资源

过滤器链:

        在一个web应用中,多个过滤器组合起来称之为一个过滤器链
        过滤器的调用顺序取决于过滤器在web.xml文件中的注册顺序,也即是决定了预处理的顺序

过滤器的使用:

在web.xml文件中加上:

<!--注册过滤器-->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>filter.CharacterEncodingFilter</filter-class>
    <!--简单的配置filter初始化参数init()中传入的config对象-->
        <init-param>
            <param-name>systemName</param-name>
            <param-value>filter Encoding</param-value>
        </init-param>
        <init-param>
            <param-name>version</param-name>
            <param-value>1.0</param-value>
        </init-param>
        <init-param>
            <param-name>CharacterEncoding</param-name><!--设置编码格式-->
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern><!--要对所有的请求都做编码集处理,所以用/*-->
    </filter-mapping>
filter-mapping 中还有一个子元素 dispather:

        如果用户直接访问页面的时候,浏览器就认为时REQUEST方式(默认),
        通过include访问另一个页面,那么就是用INCLUDE方式,
        如果资源通过requestdispatcher方法访问时,就是调用FORWARD方式,
        如果资源通过声明异常机制调用的时候,就是ERROR方式。

<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWORD</dispatcher> 就是提供了两种访问方式会调用filter过滤器

然后是过滤器的编写:

package filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(filterName = "CharacterEncodingFilter")
public class CharacterEncodingFilter implements Filter {

    private FilterConfig config;
    //一般来说,get,set方法没什么用,只是习惯性的加上,如果没有也没问题
    public void setConfig(FilterConfig config) {
        this.config = config;
    }

    public FilterConfig getConfig() {
        return config;
    }

    public void destroy() {
        //销毁类方法,销毁过滤器对象
        System.out.println("销毁对象");
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {

//        //完成过滤器功能
//        //request 做一个请求的预处理,reponse 响应后的处理,FilterChain 过滤器链对象,所有的过滤器做了一个封装,变成chian参数,传到过滤器对象中,通过调用chain对象中的doFilter方法,通知服务器请求预处理操作已完成,或者通知过滤器链中的下一个过滤器
//        String systemName = config.getInitParameter("systemName");
//        String version = config.getInitParameter("version");//获取初始化参数
//        //web.xml文件中的初始化值改变,config的值也会跟着改变
//        request.setCharacterEncoding(config.getInitParameter("CharacterEncoding"));//设置编码-0
//        chain.doFilter(request, response);//用于通知服务器请求拦截操作完成,进行下一步操作

        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;//因为过滤器中很多都和HTTP请求有关,所以转化一下
        String loginUser = (String) ((HttpServletRequest) request).getSession().getAttribute("loginUser");
        if(loginUser == null){
            httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/index.jsp?flag=1");

        }else {
            chain.doFilter(httpServletRequest,httpServletResponse);
        }


    }

    public void init(FilterConfig config) throws ServletException {
    //初始化方法,对过滤器进行一些操作  FilterConfig过滤器配置类 设置一些初始化参数,初始化过滤器
        //init函数只在最开始创建的时候调用一次
        System.out.println("初始化filter方法");
        this.config = config;//获取系统传入的config对象

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值