Bootstrap

Filter过滤器

1.Filter过滤器的用途

web中的过滤器:当有请求访问服务器的时候,过滤器可以将请求拦截下来,完成一些特殊的操作(修改请求和响应的参数、放行请求、重定向请求等)。
作用:一般用于完成通用的操作
实例:登录验证、统一编码处理、敏感字符过滤

2.过滤器的实现

  • 定义一个类实现Filter接口
  • 复写其方法()
  • 配置拦截路径
public class MyFilter implements Filter {

	@Override
	public void init(FilterConfig config) throws ServletException {
		System.out.println("===过滤器初始化===");
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("===过滤器执行===");
		//放行请求
		chain.doFilter(req, resp);
		System.out.println("===放行之后会执行响应...===");
	}
	
	@Override
	public void destroy() {
		System.out.println("===过滤器销毁===");
	}

}

3.过滤器配置详解

拦截路径配置:
  • 具体资源路径:/index.jsp 只有访问index.jsp资源时,过滤器才会被执行。

  • 拦截目录:/user/* 访问/user下的所有资源时,过滤器都会被执行

  • 后缀名拦截:/*.jsp 访问jsp后缀的资源是,过滤器都会被执行。

  • 拦截所有资源:/* 访问所有资源时,过滤器都会被执行

拦截方式配置:

资源被访问的方式

注解配置:

​ 设置dispatcherTypes属性:

​ REQUEST:默认值,浏览器直接请求资源

​ FOWORD :转发访问资源

​ INCLUDE:包含访问资源

​ error:错误跳转资源

​ async:异步访问资源

@webFilter(value="/*",dispatcherTypes = DispatcherType.REQUEST) 两种访问方式@webFilter(value="/*",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.Forward})

多个过滤器(过滤器链)

多个过滤器的执行顺序:(注意:请求和响应是相反的)
请求时是:A --> B --> C
响应时是:C --> B --> A

4.登录过滤器

mport javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebFilter("/*")
public class LoginFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        HttpSession session = request.getSession();
        //请求路径
        String path = request.getRequestURI();
        System.out.println(path);
        //获取session中作为判断的关键字
        String pwd = (String) session.getAttribute("passwd");
        //判断是否包含登录页面的请求,则放行
        if(path.indexOf("/userServlet/login")>-1){
            chain.doFilter(request, response);
        }else{//如果没有则,判断是否有session中的标志,没有则不让访问页面,让他去登录,反之放行
            if(pwd==null||"".equals(pwd)){
                response.sendRedirect("/login.jsp");
            }else{
                chain.doFilter(request, response);
            }

        }

    }

    public void init(FilterConfig config) throws ServletException {

    }

}

5.字符编码过滤器

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

@WebFilter(filterName = "EncodingFilter",
        urlPatterns = "/encodingTest",
        initParams = {
                @WebInitParam(name = "charset", value = "utf-8")
        })
public class EncodingFilter implements Filter {
    private String filterName;
    private String charset;

    public void destroy() {
//        销毁时调用
        System.out.println(filterName + "销毁");
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        /*过滤方法 主要是对request和response进行一些处理,然后交给下一个过滤器或Servlet处理*/
        System.out.println(filterName + "doFilter()");
        req.setCharacterEncoding(charset);
        resp.setCharacterEncoding(charset);
        chain.doFilter(req, resp);

    }

    public void init(FilterConfig config) throws ServletException {
        /*初始化方法  接收一个FilterConfig类型的参数 该参数是对Filter的一些配置*/
        filterName = config.getFilterName();
        charset = config.getInitParameter("charset");

        System.out.println("过滤器名称:" + filterName);
        System.out.println("字符集编码:" + charset);

    }

}

;