`
jiangduxi
  • 浏览: 458995 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

开发Web应用过滤器

阅读更多
  Web应用中的过滤器截取从客户端进来的请求,并做出处理的答复。它可以说是外部进入网站的第一道夫。在这个关卡里,可以验证客户是否来自可信的网络,可以对客户提交的数据进行重新编码,可以从系统里获得配置的信息,可以过滤掉客户的某些不应出现的词汇,可以验证客户是否已经登录,可以验证客户端的浏览器是否支持当前的应用,可以记录系统的日志等。
  可以为一个web应用组件部署多个过滤器,这些过滤器组成一个过滤链,每个过滤器只执行某个特定的操作或者检查。这样请求在达到被访问的目标之前,需要经过这个个过滤链。如果由于安全的问题不能访问目标资源,那么过滤器就可以把客户端的请求拦截。

Filter的开发
   在应用开发中,经常使用的过滤功能就是对客户端的请求进行统一编码,对客户端进行认证。下面给出一个例子。假设客户需要访问一个secutity/index.jsp页面,这个也没接收一些参数,这些参数需要保存到数据库中,为了在数据库中使用相同的编码,可以开发一个过滤器对请求进行统一编码。Security目录下的所有页面都是受限制的页面,只有通过授权的用户才能访问,如果按照平常的方式,在每个页面都对用户进行授权,这样不仅编程困难,而代码的修改也很困难,这里开发一个进行安全检查的过滤器。

1. EncodingFilter
  package com.test.ch9;
  import javax.servlet.FilterChain;
  import javax.servlet.ServletRequest;
  import javax.Servlet.ServletResponse;
  import java.io.IOException;
  import javax.servlet.Filter;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import javax.servlet.ServletException;
  import javax.servlet.FilterConfig;
  
  public class EncodingFilter implements Filter
   {
      protected FilterConfig filterConfig;
      private String targetEncoding="gb2312";
    
     // 初始化过滤器和一般的Servlet一样,它也可以获得初始参数
        public void init(FilterConfig config)throws ServletException
       { 
          this.filterConfig=config;
          this.targetEncoding=config.getInitParameter("encoding");
        }
 
     //进行过滤处理,这个方法最重要,所有过滤处理的代码都在此实现
       public void doFilter(ServletRequest srequest,ServletResponse sreponse,FilterChain chain)throws IOException,ServletException{
          System.out.println("使用以下方法对请求进行编码:encoding="+targetEncoding);
          HttpServletRequest request=(HttpServletRequest)srequest;
          request.setCharacterEncoding(targetEncoding);
          //把处理权发送到下一个
            chain.doFilter(srequest,sresponse);
           }

         public  void setFilterConfig(final FilterConfig filterConfig)  {
        this.filterConfig=filterConfig;
       }
      //销毁过滤器
        public void destroy(){
       this.filterConfig=null;
            }
    }

要开发一个Filter,必须直接或者间接实现Filter接口。Filter接口定义如下的方法:
1. init() 用于获得FilterConfig对象
2. destroy() 销毁这个Filter
3. doFilter() 进行过滤处理
在EncodingFilter中,在init方法中通过configgetInitParamter("encoding")获得FilterConfig中的参数,可以看出这种获得参数的方法和Servlet获得初始参数是一样的。doFilter是过滤器中最重要的方法,通过这个方法进行实际的业务处理,在doFilter方法中,首先获得HTTP的请求和响应对象,然后对HTTP请求中的参数进行统一编码,这里采用的编码方式是GB2312。进行编码后,就把控制权转让给下一个过滤器。如果在这个过滤链中没有下一个过滤器,那么就会把请求直接发送到目标。
下面给出Filter的描述
  <web-app>
    ...
      <filter>
         <filter-name>encoding</filter-name>
         <filter-class>com.test.ch9.EncodingFilter</filter-class>
         <init-param>
             <param-name>encoding</param-name>
             <param-value>gb2312</param-value>
         </init-param>
     </filter>
     ....
  </web-app>


上例中,首先声明了EncodingFilter的名字为encoding,然后指定它的实现类,这里是com.test.ch9.EncodingFilter。Filter的名字和实现类的指定是必需的。由于在EncodingFilter中需要使用初始参数,故在这里需要进行声明,用<init-param>声明初始参数。

2.SignonFilter
   下面我们来看另一个Filter的开发,这个Filter用于对用户的访问认证。如果认证通过,那么允许访问指定的资源;如果认证不通过,那么把请求转发到登录的界面。
过滤代码如下:
  package com.test.ch9;
  import javax.servlet.FilterChain;
  import javax.servlet.ServletRequest;
  import javax.servlet.ServletResponse;
  import java.io.IOException;
  import javax.servlet.Filter;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import javax.servlet.ServletException;
  import javax.servlet.FilterConfig;
  import javax.servlet.http.HttpSession;

 public class SignonFilter implemenets Filter
 {
    String LOGIN_PAGE="login_signon.jsp";
    protected FilterConfig filterConfig;
 
   //过滤处理的方法
    public void doFilter(final ServletRequest req,final ServletResponse res,FilterChain chain)throws IOException,ServletException{
    HttpServletRequest hreq=(HttpServletRequest)req;
    HttpServletResponse hres=(HttpServletResponse)res;
    HttpSession session=hreq.getSession();
    String isLogin="";
    try{
         isLogin=(String)session.getAttribute("isLogin");
              if(isLogin.equals("true"))
                {
                  System.out.println("在SignonFilter中验证通过");
                   //验证成功,继续处理
                      chain.doFilter(req,res);
                }
               else
                {
                  //验证不成功,让用户登录
                     hres.sendRedirect(LOGIN_PAGE);
                  System.out.println("被SignonFilter拦截一个未认证的请求");
                }
       }
    catch(Exception e)
      {
         e.printStackTrace();
      }
 
    }
       
    public void setFilterConfig(final FilterConfig filterConfig)
     {
         this.filterConfig=filterConfig;
       }      

    //销毁过滤器
     public void destroy(){
        this.filterConfig=null;
     }

    //初始过滤器和一般的Servlet一样,它也可以获得初始参数
     public void init(FilterConfig config)throws ServletException
    {
            this.filterConfig=config;
     }
  }

在SignonFilter的doFilter方法中,首先通过isLogin=(String)session.getAttribute("isLogin")代码获得用户是否登录的属性。如果这个属性是"true",表示用户已经登录,那么就可以访问目标资源;如果这个属性是"false",表示用户没有登录,那么把请求转发到"login_signon.jsp"。

配置
  配置Filter有两个任务,首先声明Filter,然后是使用Filter
   在声明Filter时,需要指定Filter的名字和Filter的实现类。如果有参数,那么要配置它的参数。在使用Filter时,主要做一些URL的映射,和Filter映射匹配的请求会被处理。例如:给前两个Filter进行配置
  <filter>
     <filter-name>encoding</filter-name>
     <filter-class>com.test.ch9.EncodingFilter</filter-class>
     <init-param>
          <param-name>encoding</param-name>
          <param-value>gb2312</param-value>
     </init-param>
 </filter>
 <filter>
   <filter-name>auth</filter-name>
   <filter-class>com.test.ch9.SignonFilter</filter-class>
 </filter>
 <filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
 </filter-mapping>
 <filter-mapping>
    <filter-name>auth</filter-name>
    <url-pattern>/security/*</url-pattern>
 </filter-mapping>
 <filter-mapping>
    <filter-name>auth</filter-name>
    <url-pattern>/admin/*<url-pattern>
 </filter-mapping>

在上面的配置中,Encoding Filter指定初始参数,这个参数的名字为"encoding",它的值为gb2312.
  接着是Filter的映射。在EncodingFilter的Filter-mapping中,它的URL Pattern为"/*",这表示对任何URL的请求都会被过滤。SignonFilter的一个URL Pattern为"/security/*",表示以/security开始的所有URL将被过滤。通过,"/admin/*"表示以/admin开始的所有URL将被过滤。
从上面的配置可以看出,一个Filter可以有多个Filter Mapping,也就是说,这个Filter可以为多个Web组件实现过滤。另一方面,一个Web组件可以有多个过滤器,这些过滤器按照配置中出现的先后组成一个过滤链。如/security/index.jsp,它就和另个过滤器匹配,这样在请求到达/security.index.jsp之前,首先经过EncodingFilter的处理。然后经过SignonFilter的处理。如果在SignonFilter中通过验证,那么将访问/security/index.jsp页面,如果认证不同,那么请求就被拦截。
分享到:
评论

相关推荐

    过滤器在Java Web开发中的应用研究.pdf

    随后,随着Servlet 3.0版本的发布,过滤器技术继续获得增强,新特性包括异步处理、注解支持和可插拔性支持等,这些都进一步简化了Java Web应用的开发和部署过程。 过滤器技术的核心是Filter接口,该接口定义了三个...

    JAVA Web中过滤器

    在JAVA Web开发中,过滤器(Filter)是一个至关重要的组件,它主要负责在请求被Servlet处理之前或之后执行一些预处理或后处理操作。过滤器是JAVA Servlet API的一部分,通过实现javax.servlet.Filter接口来创建...

    web过滤器 c#

    总结一下,Web过滤器在C#的ASP.NET开发中扮演着关键角色,它们提供了一种灵活的机制来扩展和控制Web应用程序的行为。"Web过滤器 c#"的讨论涉及了四种主要类型的过滤器,以及如何利用开源库"WebMIS....

    Java Web应用开发 52 课堂案例-应用过滤器进行身份验证.docx

    在Java Web应用开发中,过滤器(Filter)是一种强大的工具,它可以用来在请求到达目标Servlet或JSP之前对其进行处理,并在响应返回给客户端之前进行后处理。本案例着重讲解如何利用过滤器进行身份验证,避免在每个...

    Web应用与开发作业

    实现一个禁止缓存的过滤器。 要求和提示: (1)禁止浏览器缓存所有动态页面; (2)有3个http响应头字段可以禁止浏览器缓存当前页面,它们在Servlet中的示例代码如下。 response.setDateHeader("Expires",-1); ...

    java Web项目中过滤器使用方法

    在Java Web开发中,过滤器(Filter)是一个强大的工具,它允许开发者在数据处理的前后进行拦截和修改。本文将详细讲解Java Web项目中过滤器的使用方法,以及如何配置和实现过滤器。 1. **过滤器的概念** 过滤器是...

    Java Web开发中过滤器组件应用及实例解析.pdf

    【Java Web开发中的过滤器组件应用及实例解析】 ...理解过滤器的工作原理和如何在项目中有效利用它们,对于提升Java Web应用的健壮性和灵活性至关重要。通过实例分析,我们可以更直观地掌握过滤器的配置和使用方法。

    JAVA WEB中的Servlet过滤器

    Servlet过滤器是按照指定的配置顺序进行调用的,能够实现数据的预处理、后处理、权限控制、字符编码转换等多种功能,极大地增强了Web应用程序的功能性和灵活性。 Servlet过滤器的实现基于Java Servlet API中的...

    Web应用开发技术实验报告-过滤器和监听器.docx

    在本实验报告中,主题是Java Web应用开发,主要探讨了如何使用过滤器(Filter)和监听器(Listener)来增强应用程序的安全性和用户体验。实验旨在加深对Java Web开发中核心概念的理解,特别是过滤器的工作原理、配置...

    Spring整合Jetty开发web应用的例程

    通过以上知识点,我们可以理解如何使用Spring整合Jetty来开发Web应用,从而实现更高效、更灵活的开发流程。实际项目中,开发者可以根据具体需求调整配置,如添加过滤器、监听器,或者配置更多的Servlet和Filter,以...

    过滤器在Java Web开发中的应用研究.zip

    Java Web开发中的过滤器(Filter)是Servlet技术的一部分,它在Web应用程序中扮演着至关重要的角色。过滤器允许开发者在请求被发送到目标资源(如Servlet、JSP页面)之前和响应被返回给客户端之后对请求和响应进行...

    java-web -- servlet 拦截器 过滤器使用

    在Java Web开发中,Servlet、拦截...通过合理地组合和配置Servlet、过滤器和拦截器,我们可以构建出功能强大且灵活的Java Web应用。在学习和实践中,不仅要理解它们的概念,还需要掌握如何根据实际需求进行设计和优化。

    JavaWeb中过滤器的三个小案例

    以上三个案例展示了JavaWeb过滤器在实际开发中的应用。它们不仅能够提升网站的功能,还能增强系统的安全性与稳定性。理解并熟练掌握过滤器的使用,对于提升JavaWeb开发技能大有裨益。在实践中,开发者可以根据需求...

    Java Web过滤器详解

    例如,在Web应用程序中,我们可以使用过滤器来将图像格式从JPEG转换为PNG,以提高图像的质量。 五、响应内容压缩 过滤器可以对响应的内容进行压缩。例如,在Web应用程序中,我们可以使用过滤器来压缩响应的内容,以...

    完整版Java JSP web开发教程 12_过滤器(共20页).ppt

    在Java JSP Web开发中,过滤器(Filter)是一个重要的组件,它允许开发者对Web应用程序中的请求和响应进行拦截和处理,从而增强应用的功能。过滤器的概念源自Java Servlet规范,是Java EE(现称为Jakarta EE)的一...

    Java web 应用与开发教程 课件

    Java Web 应用与开发教程是针对初学者和有经验的开发者设计的一套全面学习资料,旨在帮助读者深入理解如何构建基于Java技术的Web应用程序。本教程由宋波老师编著,提供了丰富的教学内容和实践案例,以促进理论与实际...

    Web开发 乱码过滤器.zip

    在Servlet规范中,过滤器(Filter)是部署在Web应用程序中的组件,可以在请求到达目标Servlet或JSP之前对请求进行预处理。字符编码过滤器的作用是在请求被处理之前设定请求和响应的编码方式,以确保数据在传输过程中...

    Java Web应用开发项目教程(附电子教案,程序源代码,习题答案)

    学习Servlet的生命周期、请求与响应处理、会话管理以及过滤器和监听器的使用,是构建动态Web应用的基础。 3. **JSP(JavaServer Pages)**:JSP是HTML与Java代码结合的页面,用于展示动态内容。理解JSP指令、脚本...

    超实用的Web过滤技术

    为了解决这些问题,Web应用引入了过滤器技术。例如,在构建一个BBS论坛时,需要在用户发帖前进行身份验证,删除或修改帖子时进行权限检查。如果在每个页面都编写检查代码,不仅效率低下,还会降低代码的复用性。此时...

Global site tag (gtag.js) - Google Analytics