`
lgl669
  • 浏览: 173828 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

servlet登陆过滤器

    博客分类:
  • java
阅读更多

 

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[i]) != -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,过滤器是否有效。

分享到:
评论
2 楼 1055229269mao 2014-10-24  
一起学习,一起进步
1 楼 1055229269mao 2014-10-24  
亲测好用。非常感谢了

相关推荐

    servlet 过滤器做的简单登陆demo

    在这个“servlet过滤器做的简单登陆demo”中,我们将探讨如何利用过滤器实现一个基础的登录验证系统。这个例子非常适合初学者理解和实践过滤器的用法。 1. **Servlet Filter原理**: Servlet过滤器遵循`Filter`...

    Servlet过滤器的简单使用源码+文档

    描述中提到的"实现一个登陆界面",表明了过滤器可能被用作验证用户登录状态的工具。 Servlet过滤器是基于Java的Servlet API实现的,主要通过实现`javax.servlet.Filter`接口来创建。`Filter`接口定义了三个核心方法...

    Servlet转码过滤器.rar

    当用户登陆页面输入帐号时,如果输入是中文,后台servlet再次输出这个内容时,可能就会是乱码,这是因为serlvet中默认是以ISO-8859-1格式编码的,如果后台有多个Servlet,多个参数,这样就不合适,这个问题,我们可以...

    jsp+servlet登录验证过滤器

    在这个项目中,“jsp+servlet登录验证过滤器”涉及了用户登录验证的过程,以及使用过滤器(Filter)来实现这一功能。下面将详细介绍这个主题中的相关知识点。 1. **JSP**:JSP是一种服务器端的技术,允许开发者在...

    Servlet过滤器使用

    Servlet过滤器,主要配置了中文乱码及未登陆验证过滤器。 代码简单明了,易学。 过滤器实现类 1、Filter接口:所有的Servlet过滤器类都必须实现javax.servlet.Filter接口 a、init(FilterConfig): 这是Servlet...

    jsp servlet过滤器,登陆验证 获取session

    而`过滤器(Filter)`是Servlet API的一部分,它提供了一种机制来拦截请求和响应,实现诸如登录验证、字符编码转换、性能监控等功能。在这个场景中,我们关注的是使用过滤器进行登录验证,以及如何利用`session`来...

    过滤器验证用户是否已经登录

    在 web.xml 文件中配置 Servlet 过滤器,指定过滤器的名称、过滤器包所在类的名称及过滤器的映射范围等。 知识点3: 用户身份合法性确认 为了能够使用 Servlet 过滤器实现用户对 JSP 页面访问的合法性验证,需要...

    5个Servlet过滤器实例源码(JSP)

    Servlet过滤器大全,各种详细使用的代码! 一、字符编码的过滤器 二、使浏览器不缓存页面的过滤器 三、检测用户是否登陆的过滤器 四、资源保护过滤器 五 利用Filter限制用户浏览权限

    java 过滤器(附代码)

    这个过滤器的作用是检测用户是否已登陆,如果用户未登陆,将其重定向到登陆页面。实现这个过滤器的关键是使用HttpSession对象来存储用户的登陆信息。 在这个过滤器中,我们使用了Java Servlet API来实现filter接口...

    SSM登陆验证之过滤器实现

    在SSM项目中,我们通常使用`javax.servlet.Filter`接口来创建自定义过滤器。 **1. 创建过滤器类** 首先,我们需要创建一个实现了`Filter`接口的类,例如命名为`LoginFilter`。在这个类中,我们需要重写`doFilter()...

    过滤器进行登录操作

    过滤器是通过实现javax.servlet.Filter接口并配置在web.xml文件中来创建的。 对于"过滤器进行登录操作",我们主要关注以下几点: 1. **过滤器链**:多个过滤器可以组成一个过滤器链,每个过滤器按照在web.xml中的...

    包含过滤器的一个简单登陆实例

    过滤器在Java Web开发中被广泛应用,它们是Servlet规范的一部分,定义在`javax.servlet.Filter`接口中。过滤器的生命周期包括初始化、执行和销毁三个阶段,其中执行阶段又分为“doFilter”方法,用于处理请求和响应...

    idea+maven+springmvc 登录过滤器

    3. **配置过滤器**:在Spring的配置文件(如applicationContext.xml或dispatcher-servlet.xml)中,使用`&lt;filter&gt;`和`&lt;filter-mapping&gt;`元素来注册和映射我们的登录过滤器。这样,Spring就会在处理每个请求前调用...

    Java SpringBoot实现的过滤器(和拦截器)控制登录页面跳转

    在Java Servlet中,过滤器(Filter)是处理HTTP请求和响应的一个中间件,它可以拦截请求,修改请求内容,或者改变响应结果。在SpringBoot中,我们可以自定义Filter实现预处理和后处理功能,例如检查用户是否已登录...

    jsp-14-过滤器

    在Java Web开发中,JSP(JavaServer Pages)是一种用于创建动态网页的技术,而过滤器(Filter)是Servlet规范的一部分,允许我们在请求处理前后插入逻辑,以实现诸如数据验证、字符编码转换、日志记录等功能。...

    JSP登陆注册增删改查过滤器

    4. **过滤器(Filter)**:在Java Web应用中,过滤器是Servlet规范的一部分,它可以在请求到达目标Servlet或JSP之前对其进行拦截和处理。过滤器常用于身份验证、数据校验、字符编码转换、日志记录等。在“JSP登陆...

    验证用户有没有登陆的过滤器

    4. **验证用户有没有登陆的过滤器**:结合了登陆验证和过滤器的概念,是Web应用中的一种安全实践。 综上所述,验证用户有没有登录的过滤器是一个关键的安全机制,它可以防止未经授权的访问,确保只有已登录的用户...

    过滤器的使用,内有源码的说明

    - `登陆的过滤器.txt`文件可能是关于登录过滤器的详细代码示例,展示如何检查session中的登录状态并处理未登录的请求。 - `字符编码的过滤器.txt`文件则可能讲解如何编写字符编码过滤器,解决乱码问题的代码实例。 ...

    javaWEB总结(33):检查用户是否登陆过滤器

    在Java Web开发中,过滤器(Filter)是一个重要的组件,用于在请求被Servlet处理之前或之后执行特定的任务。本篇文章将深入探讨“检查用户是否登录的过滤器”这一主题,帮助开发者理解如何利用过滤器来实现用户身份...

    ajax+servlet登陆

    本项目“ajax+servlet登陆”着重探讨如何利用这两种技术实现一个无需刷新整个页面即可完成用户登录验证的功能,提高用户体验。 首先,我们需要理解Ajax的核心概念。Ajax并非一种单一的技术,而是一种使用JavaScript...

Global site tag (gtag.js) - Google Analytics