Filter

来源:互联网 发布:人体工学椅子 知乎 编辑:程序博客网 时间:2024/09/21 06:35

Filter

Filter 技术是servlet 2.3 新增加的功能。servlet2.3是sun公司于2000年10月发布的,它的开发者包括许多个人和公司团体,充分体现了sun公司所倡导的代码开放性原则。在众多参与者的共同努力下,servlet2.3比以往功能都强大了许多,而且性能也有了大幅提高。

作用

其中最重要的就是filter功能.它使用户可以改变一个request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response.换种说法,filter其实是一个“servlet chaining“(servlet 链).
包括
1. 在servlet被调用之前截获;
2. 在servlet被调用之前检查servlet request;
3. 根据需要修改request头和request数据;
4. 根据需要修改response头和response数据;
5. 在servlet被调用之后截获.

你能够配置一个filter 到一个或多个servlet;单个servlet或servlet组能够被多个filter 使用。几个实用的filter 包括:用户辨认filter,日志filter,审核filter,加密filter,符号filter,能改变xml内容的XSLT filter等。

API

javax.servlet Interface Filtervoid destroy() void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) void init(FilterConfig filterConfig) 

第一个filter

package cn.lemon.filter;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;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;MyFilter.javapublic class MyFilter implements Filter {    public void destroy() {        // TODO Auto-generated method stub    }    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {        // TODO Auto-generated method stub        // place your code here        HttpServletRequest req = (HttpServletRequest) request;        HttpServletResponse res = (HttpServletResponse) response;        //获取访问者的ip        String ip = req.getRemoteAddr();        //获取访问的资源url        String url= req.getRequestURI().toString();        //获取访问时间        SimpleDateFormat df= new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss");        Date d = new Date();        String date =df.format(d); //df.parse(string)        //输出到控制台        System.out.print(date+"\n"+ip+"\n"+url);        // pass the request along the filter chain        chain.doFilter(request, response);    }    public void init(FilterConfig fConfig) throws ServletException {        //Filter一定会随着tomcat的启动自启动。    }}

web.xml 配置

   <filter>    <filter-name>MyFilter</filter-name>    <filter-class>cn.lemon.filter.MyFilter</filter-class> </filter> <filter-mapping>    <filter-name>MyFilter</filter-name>    <url-pattern>/*</url-pattern></filter-mapping>

filter设置servlet编码

public class EncodingFilter implements Filter {

@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)        throws IOException, ServletException {    HttpServletRequest request = (HttpServletRequest) req;    HttpServletResponse response = (HttpServletResponse) res;    request.setCharacterEncoding("UTF-8");    chain.doFilter(request, response);}@Overridepublic void init(FilterConfig arg0) throws ServletException {}

}

filter登陆验证

public class AuthFilter implements Filter {

@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)        throws IOException, ServletException {    HttpServletRequest request = (HttpServletRequest) req;    HttpServletResponse response = (HttpServletResponse) res;    String userName = (String) request.getSession().getAttribute("userName");    if (userName == null){        response.sendRedirect("login.html");        return;    }    chain.doFilter(request, response);}@Overridepublic void init(FilterConfig arg0) throws ServletException {}

}

原创粉丝点击