开发者社区> 哈沙给> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

servlet过滤器

简介: 一.过滤器作用 用户认证与授权管理,统计web应用访问量(找到就访问,没的话转到其他页面)和访问命中率和形成访问报告。 实现web应用的日志处理功能 实现数据压缩和加密功能 实现xml和xstl的转换。
+关注继续查看

一.过滤器作用

  • 用户认证与授权管理,统计web应用访问量(找到就访问,没的话转到其他页面)和访问命中率和形成访问报告。
  • 实现web应用的日志处理功能
  • 实现数据压缩和加密功能
  • 实现xml和xstl的转换。

二.预备知识

    • init() :这个方法在容器实例化过滤器时被调用,它主要设计用于使过滤器为处理做准备。该方法接受一个 FilterConfig 类型的对象作为输入。
    • doFilter() :与 servlet 拥有一个 service() 方法(这个方法又调用 doPost() 或者 doGet() )来处理请求一样,过滤器拥有单个用于处理请求和响应的方法?D?D doFilter() 。这个方法接受三个输入参数:一个 ServletRequest 、 response 和一个 FilterChain (可能多个filter,按顺序执行)对象。 这里的ServletRequest和ServletResponse一般需要转换成具体的Servlet实现对于的对象,如:HttpServletRequest和HttpServletResponse。

doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

  • destroy() :正如您想像的那样,这个方法执行任何清理操作,这些操作可能需要在自动垃圾收集之前进行。当Servlet容器在销毁过滤器实例前,该方法销毁过滤器占用的资源。

三.代码

        1.访问时间限制


//访问时的过滤器(在过滤器中使用servlet初始化参数)
//下面利用init设定一个正常访问时间范围,对那些不在此时间段的访问作出记录
import java.io.IOException;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
 
public class SimpleFilter2 implements Filter {
    @SuppressWarnings("unused")
    private FilterConfig config;
    private ServletContext context;
    private int startTime, endTime;
    private DateFormat formatter;
 
    public void init(FilterConfig config) throws ServletException {
       this.config = config;
       context = config.getServletContext();
       formatter = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
              DateFormat.MEDIUM);
       try {
           startTime = Integer.parseInt(config.getInitParameter("startTime"));// web.xml
           endTime = Integer.parseInt(config.getInitParameter("endTime"));// web.xml
       } catch (NumberFormatException nfe) { // Malformed or null
           // Default: access at or after 10 p.m. but before 6 a.m. is
           // considered unusual.
           startTime = 22; // 10:00 p.m.
           endTime = 6; // 6:00 a.m.
       }
    }
 
    public void doFilter(ServletRequest request, ServletResponse response,
           FilterChain chain) {
       try {
           System.out.println("Within SimpleFilter2:Filtering the Request...");
           HttpServletRequest req = (HttpServletRequest) request;
           GregorianCalendar calendar = new GregorianCalendar();
           int currentTime = calendar.get(Calendar.HOUR_OF_DAY);
           if (isUnusualTime(currentTime, startTime, endTime)) {
              context.log("WARNING: " + req.getRemoteHost() + " accessed "
                     + req.getRequestURL() + " on "
                     + formatter.format(calendar.getTime()));
              // The log file is under <CATALINA_HOME>/logs.One log per day.
           }
           chain.doFilter(request, response);
           System.out
                  .println("Within SimpleFilter2:Filtering the Response...");
       } catch (IOException ioe) {
           ioe.printStackTrace();
       } catch (ServletException se) {
           se.printStackTrace();
       }
    }
 
    public void destroy() {}
 
    // Is the current time between the start and end
    // times that are marked as abnormal access times?
    private boolean isUnusualTime(int currentTime, int startTime, int endTime) {
       // If the start time is less than the end time (i.e.,
       // they are two times on the same day), then the
       // current time is considered unusual if it is
       // between the start and end times.
       if (startTime < endTime) {
           return ((currentTime >= startTime) && (currentTime < endTime));
       }
       // If the start time is greater than or equal to the
       // end time (i.e., the start time is on one day and
       // the end time is on the next day), then the current
       // time is considered unusual if it is NOT between
       // the end and start times.
       else {
           return (!isUnusualTime(currentTime, endTime, startTime));
       }
    }
}

          参考资料:http://zhangjunhd.blog.51cto.com/113473/20629

       2.登陆限制


public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init LoginFilter");
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        //把ServletRequest和ServletResponse转换成真正的类型
        HttpServletRequest req = (HttpServletRequest)request;
        HttpSession session = req.getSession();
        //由于web.xml中设置Filter过滤全部请求,可以排除不需要过滤的url
        String requestURI = req.getRequestURI();
        if(requestURI.endsWith("login.jsp")){
            chain.doFilter(request, response);
            return;
        }
        //判断用户是否登录,进行页面的处理
        if(null == session.getAttribute("user")){
            //未登录用户,重定向到登录页面
            ((HttpServletResponse)response).sendRedirect("login.jsp");
            return;
        } else {
            //已登录用户,允许访问
            chain.doFilter(request, response);
        }
    }
    @Override
    public void destroy() {
        System.out.println("destroy!!!");
    }
}


        3.过滤敏感词


public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        //转换成实例的请求和响应对象
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse resp = (HttpServletResponse)response;
        //获取评论并屏蔽关键字
        String comment = req.getParameter("comment");
        comment = comment.replace("A", "***");
        //重新设置参数
        req.setAttribute("comment", comment);
        //继续执行
        chain.doFilter(request, response);
    }

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
servlet
servlet相关类包括Servlet、ServletConfig、ServletContext、GenericServlet、HttpServlet等。 Servlet Servlet定义了所有servlet必须实现的功能,每一个Servlet都是运行在web服务中的一个小的java程序,用于接收并响应来自web客户端的请求。
688 0
Servlet-filter过滤器
Filter的创建过程 实现javax.servlet.Filter接口 实现init方法,读取过滤器的初始化参数 实现doFilter方法,完成对请求或响应的过滤 调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应 实现过滤器 在Servlet中,如果要定义一个过滤器,则直接让一个类实现javax.
864 0
Servlet过滤器,Servlet过滤器创建和配置
第一:Servlet的过滤器的创建和配置,创建一个过滤器对象需要实现javax.servlet.Filter接口,同时实现Filter的3个方法。        第一方法是过滤器中的init()方法用于对过滤器的初始值进行处理,第二个是destory()方法是过滤器的销毁方法,主要用于释放资源,对于过滤处理的业务逻辑需要编写到doFilter()方法中,在请求过滤处理后,需要调用chain参数的doFilter()方法将请求向下传递给下一个过滤器或者目标资源。
1295 0
Servlet,过滤器,监听器,拦截器的区别
由于最近两个月工作比较清闲,个人也比较“上进”,利用工作空余时间,也继续学习了一下,某天突然想起struts2和struts1的区别的时 候,发现为什么struts1要用servlet,而struts2要用filter呢?一时又发现,servlet和filter有什么区别呢?于是看 了看web.xml,一时又发现,咦,servlet、filter、listener?还有个interceptor?对于这几个概念,本应是初学者就 掌握的东东了,可惜本人基础学的不好,只能是现在补课。
1356 0
[Servlet&JSP] 过滤器的使用
过滤器介于Servlet之前,可拦截过滤浏览器对Servlet的请求,也可以改变Servlet对浏览器的响应。 过滤器的概念 像性能测量、用户验证、字符替换、压缩等需求,应该设计为独立的组件,随时可以添加到应用程序之中,也可以随时移除,而不用修改原有的程序。Servlet/JSP提供了过滤器机制以实现这些组件服务,可视需求抽换过滤器或调整过滤器的顺序,也可以针对不同的
1340 0
Servlet
  Servlet担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。 Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。
731 0
+关注
哈沙给
渣渣一枚
1101
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载