Filter过滤器

过滤器

过滤器的介绍

filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目 标资源访问前后进行逻辑处理

过滤的目的:

实际上在JavaEE中,使用过滤器的目的也就是这两个,过滤器在java EE中也叫做Servlet程序,后面讲解的监听器也属于Servlet范畴

  • 安全
  • 干净

    Servlet有三种:

  • 标准的Servlet
  • 过滤的Servlet
  • 监听的Servlet
    过滤器是在Servlet2.3加入的新功能,当用户需要限制某些操作的时候,就可以进行过滤器进行过滤,是以一种组件的形式绑定到web程序中,与其他组件不同的是,过滤器采用的是链式的方式进行处理。

作用

过滤器目前在开发中,主要的作用有三个:

  • 过滤非法文字
  • 请求请求统一编码的设置
  • 过滤非法用户

过滤器的实现

在java EE中过滤器的实现非常简单,只需要实现一个过滤接口:Filter接口,这个接口中有三个方法:

  • 过滤器服务方法:void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  • 过滤器的销毁:void destroy()
  • 过滤器的初始化:void init(FilterConfig filterConfig)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class FilterDemo01 implements Filter {

@Override
public void destroy() {
System.out.println("过滤器销毁");
}

@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
System.out.println("过滤器doFilter");
}

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

}

过滤器写好了之后,目前没有运行,因为过滤器还需要进行配置,配置的形式有两种:

  • 配置web.xml文件
  • 使用注解
    第一种:在web.xml中配置过滤器
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!-- 配置过滤器 -->
    <filter>
    <filter-name>过滤器名字</filter-name>
    <filter-class>过滤器的类的地址</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>过滤器名字</filter-name>
    <!-- 表示过滤器仅仅过滤/index.jsp 这个请求地址 * 表示过滤所有的请求地址 -->
    <url-pattern>过滤的请求地址</url-pattern>
    </filter-mapping>

以上配置的Servlet只能在地址栏请求index.jsp的时候才会执行,但是在开发中,过滤器一般都是配置所有请求,也就是说过滤器会过滤所有的请求。

1
2
3
4
5
6
7
8
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("过滤器doFilter");
//如果想要继续执行操作的话可以使用
filterChain.doFilter(request, response);//继续向下执行
//这个时候过滤器的操作就很明显了 只要按照特定的要求是否能够继续向下执行问题
}

第二种:通过注解的方式完成过滤器配置

1
@WebFilter("*")

通过运行发现过滤器的生命周期:

  • 在tomcat启动的时候Filter会进行初始化
  • 每次浏览器访问过滤器过滤的地址的时候,过滤器的doFilter方法都会执行
  • 过滤器的销毁是在tomcat关闭的时候销毁

过滤具体的使用

  • 过滤非法文字:比如提交的内容中,还有反动话语,或者骂人的脏话,不能够向下执行。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    System.out.println("过滤器doFilter");
    boolean flag = true;
    Enumeration<String> names = request.getParameterNames();
    while(names.hasMoreElements()) {
    if(request.getParameter(names.nextElement()).equals("TMD")) {
    System.out.println("非法文字");
    flag = false;
    }
    }

    if(flag) {
    chain.doFilter(request, response);
    }
  • 对请求编码进行统一的设置

    1
    2
    3
    4
    5
    6
    7
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
    throws IOException, ServletException {
    System.out.println("过滤器doFilter");
    request.setCharacterEncoding("utf-8");//设置请求的统一编码
    filterChain.doFilter(request, response);//继续向下执行

    }
  • 过滤非法用户:比如我们网银系统,没有登录的人是不能够查询账户信息、余额、交易记录的,再比如我们的教务系统,没有登录是什么也不能做的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebFilter("*")
public class LoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//过滤非法用户:没有登录的用户只能够访问登录页面
/*
* session域中有name名称对应的内容的话,不用过滤
* 登录页面不能过滤
* 登录验证的Servlet不能过滤
* 如果存在注册的功能的话,注册和注册Servlet也是不能过滤的
* */
HttpSession session = req.getSession();
//获取请求的url地址
String url = req.getRequestURL().toString();
String uri = req.getRequestURI();
System.out.println(url + "===========" +uri);
if(null != session.getAttribute("name") || //session已经存在
uri.indexOf("login.jsp") != -1 || //登录页面不能过滤
uri.indexOf("loginServlet") != -1 || //登录验证不能过滤
uri.indexOf("regeister.jsp") !=-1 || //注册页面不能过滤
uri.indexOf("regeisterServlet") != -1) { //注册servlet不能过滤
chain.doFilter(request, response);
}
else {
String path = req.getContextPath();
resp.sendRedirect(path+"/login.jsp");
}
}
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("loginFilter初始化");
}
}

小结

  • 过滤器属于一种自动的Servlet,能够自动的执行
  • 过滤器的配置有两种方式,一种是通过web.xml配置,第二种是通过注解的形式完成
  • 过滤的常见的操作就是过滤非法文字、非法用户和设置统一的编码
-------------本文结束,感谢您的阅读-------------
您的支持将鼓励我继续创作!!