zoukankan      html  css  js  c++  java
  • 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 自动生成的方法存根
    
        }
    }
  • 相关阅读:
    idea 导入(非maven)web项目并发布到tomcat服务器
    EasyUI-combotree 下拉树 数据回显时默认选中
    千万级别数据量mysql优化策略
    MySQL忘记密码,或:root密码重置报错:mysqladmin: connect to server at 'localhost' failed的解决方案
    centOS 6.5下升级mysql,从5.1升级到5.7
    查看mysql数据库版本方法总结
    【转】App开发者必备的运营、原型、UI设计工具整理
    APP原型设计工具,哪家强?转自知乎
    数据库为什么要分库分表
    20180925-1 每周例行报告
  • 原文地址:https://www.cnblogs.com/AnswerTheQuestion/p/6395895.html
Copyright © 2011-2022 走看看