过滤器

概念

首先过滤器,顾名思义,他的作用就是阻挡某些事件的发生。在Web应用程序中,过滤器介于Servlet之前,既可以拦截,过滤器浏览器的请求,也乐意改变对浏览器的响应。在中间起到了一个中间组件的作用,对二者的信息进行过滤。
实现功能
1.对用户请求进行身份验证
2.对用户发送的数据进行过滤或者替换
3.转换图像的数据格式
4.数据压缩
5.数据加密
6.XML数据的转换
7.修改请求数据的字符集
8.日志记录和审核
实现与设置过滤器
首先要实现Filter接口可使用注入的方式或者在Web.xml中进行配置,并设置要求过滤的内容。

 <filter>
        <filter-name>testfilter</filter-name>
        <filter-class>until7test1.testFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>testfilter</filter-name>
        <url-pattern>/until7test1/*
    

Filter接口实现的方法
default void init(FilterConfig filterConfig)
初始化过滤器,filterConfig该对象可得到过滤器中初始化配置的参数信息
在服务器启动时创建。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain Chain)
在过滤器中主要实现过滤的方法。客户端去请求目标资源时,Web应用程序会调用与此目标资源相关的doFilter()方法。实现对请求和响应的数据处理。可调用 Chain. doFilter(request,response)放行,若无下一个过滤器执行目标资源,若无则执行下一个过滤器。
*default void destory() *释放过滤器中使用的资源。
过滤器四种拦截
请求,转发,包含,错误

<dispatcher>REQUEST</dispatcher> 默认为request

设置多个过滤器的执行顺序,则只需设置

<filter-mapping> </filter-mapping>//前后顺序

FilterConfig接口
该接口用于在过滤器初始化时由Web容器向过滤器传送初始化配置参数,传入到过滤器对象的init()方法中。
*public String getFilterName();*用于得到过滤器的名字
public String getInitParameter(String name) 得到过滤器中初始化的参数值
*public ServletContext getServletContext()*得到Servlet上下文文件对象。

案例
这里使用过滤器对GET和POST请求的编码设置

//testrequest类
public class testrequest extends HttpServletRequestWrapper {
    private HttpServletRequest req;
    public testrequest(HttpServletRequest request) {
        super(request);
        this.req = request;
    }
    public String getParameter(String usename){
        String value = req.getParameter(usename);
        try {
            value = new String(value.trim().getBytes("ISO-8859-1"),"utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return value;
    }
}

对于GET方法参数存放在URL字段中servletRequest.setCharacterEncoding(“utf-8”);只对消息中的数据启作用。这里我们将去重写getParameter()方法,将字符编码转换的操作,放到该方法中。这里继承HttpServletRequestWrapper类,提供HttpServletRequest接口的便捷实现,希望将请求调整为Servlet的开发人员可以将其子类化。此类实现Wrapper或Decorator模式。方法默认情况下是调用包装的请求对象。

//testFilter
public class testFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        HttpServletRequest req = (HttpServletRequest) servletRequest;

        if (req.getMethod().equals("GET")){
            testrequest re = new testrequest(req);
            filterChain.doFilter(re,servletResponse);
        }else if(req.getMethod().equals("POST")){

            filterChain.doFilter(servletRequest,servletResponse);
        }
    }

    @Override
    public void destroy() {

    }
}

这里则是对于响应的请求方式进行逻辑判断,去放行过滤器对目标资源进行请求。这里将HttpServletRequest的对象 调给继承HttpServletRequestWrapper的类,获取该类的对象,并实现重写的方法。

//Servlet
public class testServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
        response.setContentType("text/html;charset = utf-8");
        String use = request.getParameter("usename");
        PrintWriter out = response.getWriter();
        out.println("");
        out.println("");
        out.println("test");
        out.println(use);
        out.println("");
        out.println("");
        out.flush();
        out.close();
    }
    public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
        //request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset = utf-8");
        String use = request.getParameter("usename");
        PrintWriter out = response.getWriter();
        out.println("");
        out.println("");
        out.println("test");
        out.println(use);
        out.println("");
        out.println("");
        out.flush();
        out.close();
    }
}

Servlet对于请求内容转发到页面输出显示。

你可能感兴趣的:(过滤器,java,servlet,filter)