Java Web之过滤器

2017-05-23  本文已影响49人  MVBin

知识点

1、 含义:过滤器是指对客户端向服务器端的web目标资源发出的请求,以及服务器端所做出的响应进行截取并处理。
2、 生命周期:①实例化(Web容器在部署Web应用程序时对所有过滤器进行实例化,也就是调用过滤器的构造方法)②初始化(实例化完成后立马对其进行初始化,也就是调用过滤器的init())③工作(也就是进行过滤URL,调用过滤器的doFilter())④销毁(web容器关闭时调用过滤器的destroy())
3、 分类:①request过滤器(过滤重定向请求,至少进行两次请求,两次响应,默认的过滤方式)②forward过滤器(过滤请求转发,进行一次请求,一次响应)③include过滤器(针对jsp页面的<jsp:include></jsp:include>里的路径进行过滤)④error过滤器(过滤web.xml文件中的<error-page></error-page>里的路径进行过滤)⑤async过滤器(异步过滤器)

字符编码过滤器

首先,在web.xml文件中进行过滤器的配置

<filter>
    <!-- 过滤器的名字 -->
    <filter-name>encodingFilter</filter-name>
    <!-- 过滤器类的完全限定名-->
    <filter-class>com.mvbin.filter.CharacterEncodingFilter</filter-class>
    <!-- 过滤器类的初始化参数 -->
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>   
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <!-- 过滤器要过滤的请求路径:/* 表示过滤所有路径 -->
    <url-pattern>/*</url-pattern>
</filter-mapping>

其次,编写过滤器类的代码,过滤器继承javax.servlet.Filter,并实现其三个方法

import *****;

//字符过滤器类
public class CharacterEncodingFilter implements Filter {

    private String encoding;

    //过滤器的销毁方法,在web容器关闭时执行
    @Override
    public void destroy() {

    }

    //过滤器真正的核心方法,在这里对响应的请求进行过滤处理
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        //将所有的请求的编码格式转化为UTF-8
        request.setCharacterEncoding(encoding);
        //调用FilterChain的doFilter方法,进行放行
        chain.doFilter(request, response);
    }

    //过滤器的初始化方法,在web容器启动时进行执行
    @Override
    public void init(FilterConfig config) throws ServletException {
        //通过FilterConfig的getInitParameter方法获取web.xml中配置的初始化参数
        this.encoding = config.getInitParameter("encoding");
        System.out.println("init: " + encoding);
    }
}

验证是否登录过滤器

首先,web.xml文件中进行配置

<!-- 验证是否登录过滤器 -->
<filter>
    <filter-name>checkLoginFilter</filter-name>
    <filter-class>com.mvbin.filter.CheckLoginFilter</filter-class>
    <!-- 配置不进行过滤验证的路径 -->
    <init-param>
        <param-name>noCheckUrl</param-name>
        <param-value>index.jsp,user.jspx</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>checkLoginFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>   

其次,编写过滤器代码

import ***;

//CheckLoginFilter类
public class CheckLoginFilter implements Filter {

    private String noCheckUrl;

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        //进行强制类型转换
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        //根据,进行字符串分割
        String[] urls = noCheckUrl.split(",");
        //获取session中是否存在loginUser
        User user = (User) req.getSession().getAttribute("loginUser");
        //foreach循环进行验证,包含不过滤的路径的话就放行
        for (String str : urls) {
            String uri = req.getRequestURI();
            //css文件及js文件也要可以通过过滤
            if(uri.indexOf(str) != -1 || uri.endsWith("css") || uri.endsWith("js")) {
                chain.doFilter(request, response);          
                return;
            }
        }
        //判断user是否为空
        if(user == null) {
            resp.sendRedirect("index.jsp");
        } else {
            //不为空则放行
            chain.doFilter(request, response);          
        }
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
        //获取不过滤的路径
        this.noCheckUrl = config.getInitParameter("noCheckUrl");
    }
}
上一篇下一篇

猜你喜欢

热点阅读