Servlet 编写过滤器

Servlet 过滤器是可用于 Servlet 编程的 Java 类,有以下目的:

• 在客户端的请求访问后端资源之前,拦截这些请求。
• 在服务器的响应发送回客户端之前,处理这些响应。

根据规范建议的各种类型的过滤器:
• 身份验证过滤器(Authentication Filters);
• 数据压缩过滤器(Data compression Filters);
• 触发资源访问事件过滤器;
• MIME-TYPE 链过滤器(MIME-TYPE Chain Filters);

下面我们就在Servlet中编写一个过滤器

  // 导入必需的 java 库
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.util.*;
    
/**
 * @author TanGuozheng
 */
public class LoginFilter implements Filter  {

    private static List passList = null;
    private static String encoding = null;
    private static String encodeType = null;

    @Override
    public void  init(FilterConfig config){
        // 在初始化的时候,为变量赋值
        // 获取页面编码格式
        if(encoding == null) {
            encoding = config.getInitParameter("encode");
        }

        // 获取响应的编码格式
        if(encodeType == null) {
            encodeType = config.getInitParameter("encodeType");
        }

        // 获取允许通过的页面
        if(passList == null) {
            String pass = config.getInitParameter("pass");
            passList = Arrays.asList(pass.split(","));
        }
    }
    @Override
    public void  doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        // 设置页面的编码格式
        request.setCharacterEncoding(encoding);
        response.setContentType(encodeType);

        // 将Servlet对象转换成符合Http协议的Servlet对象,方便获取URL
        HttpServletRequest httpServletRequest = (HttpServletRequest)request;
        HttpServletResponse httpServletResponse = (HttpServletResponse)response;

        // 获取URL,并且截取用户需要跳转到的页面
        String url = httpServletRequest.getRequestURI();
        String toFile = url.substring(url.lastIndexOf("/"));

        // 判断是否为可以访问的页面
        if(passList.contains(toFile)){
            // 可以通过
            chain.doFilter(request,response);
        }else{
            // 需要登录才能访问的页面
            Object o = httpServletRequest.getSession().getAttribute("user");
            if(o!=null) {
                // 用户登录成功,跳转到需要访问的页面
                chain.doFilter(request,response);
            }else{
                // 用户没有登录,跳转到登录页面
                httpServletResponse.sendRedirect("login.jsp");
            }
        }
    }
    @Override
    public void destroy( ){
        /* 在 Filter 实例被 Web 容器从服务移除之前调用 */
    }
}

Web.xml 中的 Servlet 过滤器映射(Servlet Filter Mapping)
定义过滤器,然后映射到一个 URL 或 Servlet,这与定义 Servlet,然后映射到一个 URL 模式方式大致相同。在部署描述符文件 web.xml 中为 filter 标签创建下面的条目:


    LoginFilter
    com.mokerson.LoginFilter
    
    
        encoding
        UTF-8
    
    
    
        encodeType
        text/html; charset=UTF-8
    
    
    
        pass
        login.jsp,news.jsp,register.jsp
    


    LoginFilter
    
    *.jsp

上述过滤器适用于所有的 Servlet,因为我们在配置中指定 /* 。如果您只想在少数的 Servlet 上应用过滤器,您可以指定一个特定的 Servlet 路径。
现在试着以常用的方式调用任何 Servlet,您将会看到在 Web 服务器中生成的日志。您也可以使用 Log4J 记录器来把上面的日志记录到一个单独的文件中。

使用多个过滤器

Web 应用程序可以根据特定的目的定义若干个不同的过滤器。假设您定义了两个过滤器 AuthenFilter 和 LoginFilter。您需要创建一个如下所述的不同的映射,其余的处理与上述所讲解的大致相同:


   LoginFilter
   LoginFilter



   AuthenFilter
   AuthenFilter



   LoginFilter
   /*



   AuthenFilter
   /*

过滤器的应用顺序

web.xml 中的 filter-mapping 元素的顺序决定了 Web 容器应用过滤器到 Servlet 的顺序。若要反转过滤器的顺序,您只需要在 web.xml 文件中反转 filter-mapping 元素即可。

你可能感兴趣的:(Servlet,过滤器)