Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 318|回复: 0

[servlet学习]一个servlet登陆过滤器

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-10 07:00:19 | 显示全部楼层 |阅读模式
    1.Servlet 过滤器是什么?
         Servlet 过滤器是小型的 Web 组件,它们拦截请求和响应,以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。过滤器是通常封装了一些功能的 Web 组件,这些功能虽然很重要,但是对于处理客户机请求或发送响应来说不是决定性的。典型的例子包括记录关于请求和响应的数据、处理安全协议、管理会话属性,等等。过滤器提供一种面向对象的模块化机制,用以将公共任务封装到可插入的组件中,这些组件通过一个配置文件来声明,并动态地处理。

          Servlet 过滤器中结合了许多元素,从而使得过滤器成为独特、强大和模块化的 Web 组件。也就是说,Servlet 过滤器是:

    声明式的:过滤器通过 Web 部署描述符(web.xml)中的 XML 标签来声明。这样允许添加和删除过滤器,而无需改动任何应用程序代码或 JSP 页面。

    动态的:过滤器在运行时由 Servlet 容器调用来拦截和处理请求和响应。   
      
       
       
       

       
      
    灵活的:过滤器在 Web 处理环境中的应用很广泛,涵盖诸如日志记录和安全等许多最公共的辅助任务。过滤器还是灵活的,因为它们可用于对来自客户机的直接调用执行预处理和后期处理,以及处理在防火墙之后的 Web 组件之间调度的请求。最后,可以将过滤器链接起来以提供必需的功能。

    模块化的:通过把应用程序处理逻辑封装到单个类文件中,过滤器从而定义了可容易地从请求/响应链中添加或删除的模块化单元。

    可移植的:与 java 平台的其他许多方面一样,Servlet 过滤器是跨平台和跨容器可移植的,从而进一步支持了 Servler 过滤器的模块化和可重用本质。

    可重用的:归功于过滤器实现类的模块化设计,以及声明式的过滤器配置方式,过滤器可以容易地跨越不同的项目和应用程序使用。

    透明的:在请求/响应链中包括过滤器,这种设计是为了补充(而不是以任何方式替代)servlet 或 JSP 页面提供的核心处理。因而,过滤器可以根据需要添加或删除,而不会破坏 servlet 或 JSP 页面。

    2.Servlet 过滤器体系结构

          正如其名称所暗示的, Servlet 过滤器用于拦截传入的请求和/或传出的响应,并监视、修改或以某种方式处理正在通过的数据流。过滤器是自包含、模块化的组件,可以将它们添加到请求/响应链中,或者在无需影响应用程序中其他 Web 组件的情况下删除它们。过滤器仅只是改动请求和响应的运行时处理,因而不应该将它们直接嵌入 Web 应用程序框架,除非是通过 Servlet API 中良好定义的标准接口来实现。

         Web 资源可以配置为没有过滤器与之关联(这是默认情况)、与单个过滤器关联(这是典型情况),甚至是与一个过滤器链相关联。那么过滤器究竟做什么呢? 像 servlet 一样,它接受请求并响应对象。然后过滤器会检查请求对象,并决定将该请求转发给链中的下一个组件,或者中止该请求并直接向客户机发回一个响应。如果请求被转发了,它将被传递给链中的下一个资源(另一个过滤器、servlet 或 JSP 页面)。在这个请求设法通过过滤器链并被服务器处理之后,一个响应将以相反的顺序通过该链发送回去。这样就给每个过滤器都提供了根据需要处理响应对象的机会。

         当过滤器在 Servlet 2.3 规范中首次引入时,它们只能过滤 Web 客户机和客户机所访问的指定 Web 资源之间的内容。如果该资源然后将请求调度给其他 Web 资源,那就不能向幕后委托的任何请求应用过滤器。2.4 规范消除了这个限制。Servlet 过滤器现在可以应用于 J2EE Web 环境中存在请求和响应对象的任何地方。因此,Servlet 过滤器可以应用在客户机和 servlet 之间、servlet 和 servlet 或 JSP 页面之间,以及所包括的每个 JSP 页面之间。这才是我所称的强大能力和灵活性!

    3.编写实现类的程序
         过滤器 API 包含 3 个简单的接口,它们整洁地嵌套在 javax.servlet 包中。那 3 个接口分别是 Filter 、 FilterChain 和 FilterConfig 。从编程的角度看,过滤器类将实现 Filter 接口,然后使用这个过滤器类中的 FilterChain 和 FilterConfig 接口。该过滤器类的一个引用将传递给 FilterChain 对象,以允许过滤器把控制权传递给链中的下一个资源。 FilterConfig 对象将由容器提供给过滤器,以允许访问该过滤器的初始化数据。

    为了与我们的三步模式保持一致,过滤器必须运用三个方法,以便完全实现 Filter 接口:

    init() :这个方法在容器实例化过滤器时被调用,它主要设计用于使过滤器为处理做准备。该方法接受一个 FilterConfig 类型的对象作为输入。

    doFilter() :与 servlet 拥有一个 service() 方法(这个方法又调用 doPost() 或者 doGet() )来处理请求一样,过滤器拥有单个用于处理请求和响应的方法?D?D doFilter() 。这个方法接受三个输入参数:一个 ServletRequest 、 response 和一个 FilterChain 对象。

    destroy() :正如您想像的那样,这个方法执行任何清理操作,这些操作可能需要在自动垃圾收集之前进行。

    SessionFilter.java
    package net.pms.web.filter;

    import java.io.IOException;

    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.HttpServletResponseWrapper;

    /**
    * @author jfish
    * @since 2006.1.12
    */
    public class SessionFilter implements Filter {

          public static boolean isContains(String container, String[] regx) {
                boolean result = false;

                for (int i = 0; i < regx.length; i++) {
                      if (container.indexOf(regx) != -1) {
                            return true;
                      }
                }
                return result;
          }

          public FilterConfig config;

          public void setFilterConfig(FilterConfig config) {
                this.config = config;
          }

          public FilterConfig getFilterConfig() {
                return config;
          }

          public void doFilter(ServletRequest request, ServletResponse response,
                      FilterChain chain) throws IOException, ServletException {

                HttpServletRequest httpreq = (HttpServletRequest) request;
                HttpServletResponse httpres = (HttpServletResponse) response;

                HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(
                            (HttpServletResponse) response);
                String logonStrings = config.getInitParameter("logonStrings");
                String includeStrings = config.getInitParameter("includeStrings");
                String redirectPath = httpreq.getContextPath()
                            + config.getInitParameter("redirectPath");
                String disabletestfilter = config.getInitParameter("disabletestfilter");

                if (disabletestfilter.toUpperCase().equals("Y")) {
                      chain.doFilter(request, response);
                      return;
                }
                String[] logonList = logonStrings.split(";");
                String[] includeList = includeStrings.split(";");
                Object user = httpreq.getSession().getAttribute("userinfo");
                if (user == null) {
                      if (!this.isContains(httpreq.getRequestURI(), includeList)) {
                            chain.doFilter(request, response);
                            return;
                      }
                      if (this.isContains(httpreq.getRequestURI(), logonList)) {
                            chain.doFilter(request, response);
                            return;
                      }
                      wrapper.sendRedirect(redirectPath);

                } else {
                      chain.doFilter(request, response);
                }
          }

          public void destroy() {
                this.config = null;
          }

          public void init(FilterConfig filterConfig) throws ServletException {
                this.config = filterConfig;
          }
    }

    4.配置 Servlet 过滤器
    在web.xml中:
             <filter>
                <filter-name>SessionFilter</filter-name>
                <filter-class>net.pms.web.filter.SessionFilter</filter-class>
                <init-param>
                      <param-name>logonStrings</param-name>
                      <param-value>login.jsp</param-value>
                </init-param>
                <init-param>
                      <param-name>includeStrings</param-name>
                      <param-value>.jsp;.HTML</param-value>
                </init-param>
                <init-param>
                      <param-name>redirectPath</param-name>
                      <param-value>/login.jsp</param-value>
                </init-param>
                <init-param>
                      <param-name>disabletestfilter</param-name>
                      <param-value>N</param-value>
                </init-param>
          </filter>
           <filter-mapping>
                <filter-name>SessionFilter</filter-name>
                <url-pattern>/*</url-pattern>
          </filter-mapping>
    其中参数logonStrings,登陆页面
    includeStrings,过滤页面参数
    redirectPath,没有登陆转向页面
    disabletestfilter,过滤器是否有效。
      

      
      
       
       

         
       

         
       
      



    源码下载:http://file.javaxxz.com/2014/10/10/070019453.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-22 22:55 , Processed in 0.403664 second(s), 51 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表