servlet过滤器

Posted AnswerTheQuestion

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了servlet过滤器相关的知识,希望对你有一定的参考价值。

1.什么是Servlet过滤器?

过滤器实质上就是Web应用服务器上的一个Web应用组件,用于拦截客户端(浏览器)与目标资源的请求,病对这些请求进行一定过滤处理在发送给目标资源。(如下图所示)

Web容器在进行过滤时,将按照过滤器的先后顺序对请求进行处理。

2.过滤器的核心对象

过滤器对象放置在javax.servlet包中,其名称为Fiter,它是一个接口,出了这个接口,与过滤器相关的对象还有FilterConfig对象、FilterChain对象,所以在实际的开发中,定义过滤器对象只需要直接或者间接的实现Filter接口即可。

A.Filter接口:(在Filter接口中定义了三个方法)

init();过滤器的初始化方法,该方法在过滤器初始化时调用

doFilter();对请求进行过滤处理

destory();销毁方法以便释放资源

B.FilterChain接口:

在这个接口中只有一个方法,doFilter(ServletRequest  request , SrevletResponse  response);

该方法用于将过滤后的请求传递给下一个过滤器,如果此过滤器是过滤器链中的最后一个过滤器,那么请求将传给目标资源。

如果没有写doFilter();将不再继续往下执行过滤和请求!

C.FilterConfig接口:

主要用于获取过滤器中的配置信息,主要方法有:


3.过滤器的创建与配置

一、创建一个类实现Filter接口并且实现其接口中的三个方法(如上所述)

二、在XML文件中声明其过滤器(如下图所示)

例一:判断用户是否登录(但是有一点需要清楚:我们不能所有的页面都设置用户权限的过滤器,如果这样我们永远停留在登录界面,所以我们要把没有权限的页面放到XML中配置一下,如上图所示)

package com.inba.maya.myfilter;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;

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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class UserFilter implements Filter {
    ArrayList<String> list=new ArrayList<String>();
    
    @Override
    public void init(FilterConfig fc) throws ServletException {
        String userName=fc.getInitParameter("userName");//获取配置文件当中的属性值
        String[] u=userName.split(",");//把获取出来的值用,分割
        list.addAll(Arrays.asList(u));//把数组添加到集合list中        
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse respons, FilterChain chain)
            throws IOException, ServletException {
        //首先将父类中的request和response转化成其子类(HttpServletRequest)中的request
        HttpServletRequest req=(HttpServletRequest)request;
        HttpServletResponse rep=(HttpServletResponse)respons;
        
        //获得URL路径
        String path1=req.getRequestURI();
        String path2=req.getContextPath();
        String p=path1.substring(path2.length());
        //如果集合中的元素等于当前的路径那么放行!,否则我们就要判断它有没有用户权限访问该页面
        //如果有那么放行!否则打回到初始页面
        if(list.contains(p)){
            chain.doFilter(request, respons);
        }else{
            HttpSession session=req.getSession();
            if(session.getAttribute("user") != null){
                chain.doFilter(request, respons);
            }else{
                rep.sendRedirect("index.jsp");
            }
        }                
    }
    @Override
    public void destroy() {
        // TODO 自动生成的方法存根
    }

}

例二:敏感词汇的转换

 

package com.inba.maya.myfilter;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;

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.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;

public class CharFilter implements Filter {
    ArrayList<String> list=new ArrayList<String>();
    
    //过滤器的初始化方法
        @Override
        public void init(FilterConfig fc) throws ServletException {
            //获取过滤器的初始化参数值
            String charName=fc.getInitParameter("charName");
            String[] zchar=charName.split(",");
            list.addAll(Arrays.asList(zchar));
        }
        
        //内部类--目的是把现有的request转化一下再往下传递
        class MyFilter extends HttpServletRequestWrapper{
            
            private HttpServletRequest request;
            public MyFilter(HttpServletRequest request) {
                super(request);
                this.request=request;
            }
            @Override
            public String getParameter(String name) {
                String txt=request.getParameter("txt");
                for(String s:list){
                    txt=txt.replaceAll(s, "***");
                }                
                return txt;
            }            
        }

    //对请求进行过滤处理
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req=(HttpServletRequest)request;
        HttpServletResponse rep=(HttpServletResponse)response;
        //把req放进去获得了转换后的request
        MyFilter myRequest=new MyFilter(req);
        chain.doFilter(myRequest, response);
    }        
    @Override
    //销毁方法,以便释放资源
    public void destroy() {
        // TODO 自动生成的方法存根

    }
}

 

以上是关于servlet过滤器的主要内容,如果未能解决你的问题,请参考以下文章

是否可以编写一个 servlet 过滤器来检查 HTTP 响应代码? [复制]

Servlet过滤器行为模棱两可?

servlet 过滤器(Filter)

javaweb-Servlet过滤器Filter

为什么我不能在此片段中生成唯一对象数组?

servlet 过滤器中的 StringBuffer 与 StringBuilder