用SERVLET过滤来实现权限控制

原创 2003年08月20日 10:56:00

SERVLET过滤来实现权限控制

                                                 

简介

过滤是SERVLET23规范新有的功能,目前TOMCAT4WEBLOGIC7都已支持。它能实现很多以前使用不便或很难实现的功能,在产品体系中,我们可以很好地使用SERVLET过滤,使得各个部件可以在保持系统统一权限控制的前提下,来实现各个独自的个性权限系统。

下面先看下SERVLET过滤是如何工作的,如下图:

 

1. 过滤器与 J2EE 请求处理

 

 

由图我们可以看出,SERVLET过滤是在J2EE平台内WEB容器中执行,任何静态或动态业务请求都将通过这个过滤通道。

 

优点

和传统架构相比,SERVLET过滤的优点如下:

在传统架构中:

  • 每次接受到请求,挂钩式方法就被调用,不论它们是否执行(有时甚至是空的)。
  • 方法的作用域及并发关系(每个方法可能在不同的线程上被调用)不允许在处理相同的请求时简单、高效地共享不同挂钩式方法调用间的变量和信息。

SERVLET过滤中:

  • 嵌套的方法调用通过一系列过滤器实现,它仅有应用于当前请求的过滤器组成;基于挂钩式调用的传统执行方式需要在处理短句中调用挂钩式例程,即使一个特定短句的处理逻辑不起任何作用。
  • 局部变量在实际的过滤方法返回之前都作保留,并且可用(因为上游过滤器的调用总在堆栈上,等待后续调用的返回)。

过滤的实现

调用链
所有过滤器都服从调用的过滤器链,并通过定义明确的接口得到执行。一个执行过滤器的 Java 类必须执行这一
javax.servlet.Filter 接口。这一接口含有三个过滤器必须执行的方法:

  • doFilter(ServletRequest, ServletResponse, FilterChain):这是一个完成过滤行为的方法。这同样是上游过滤器调用的方法。引入的 FilterChain 对象提供了后续过滤器所要调用的信息。
  • init(FilterConfig):这是一个容器所调用的初始化方法。它保证了在第一次 doFilter() 调用前由容器调用。您能获取在 web.xml 文件中指定的初始化参数。
  • destroy():容器在破坏过滤器实例前,doFilter()中的所有活动都被该实例终止后,调用该方法。

嵌套调用在 doFilter() 方法执行中发生。除非您建立一个过滤器明确阻止所有后续处理(通过其它过滤器及资源处理器),否则过滤器一定会在 doFilter 方法中作以下的调用:

FilterChain.doFilter(request, response);

 

安装过滤器:定义与映射
容器通过 Web 应用程序中的配置描述符 web.xml 文件了解过滤器。有两个新的标记与过滤器相关:
<filter><filter-mapping>。应该指定它们为 web.xml 文件内 <web-app> 标记的子标记。

过滤器定义的元素
<filter> 标记是一个过滤器定义,它必定有一个 <filter- name><filter-class> 子元素。<filter-name> 子元素给出了一个与过滤器实例相关的、基于文本的名字。<filter-class> 指定了由容器载入的实际类。您能随意地包含一个 <init-param> 子元素为过滤器实例提供初始化参数。例如,下面的过滤器定义指定了一个叫做 IE Filter 的过滤器:

清单 1. 过滤器定义标记

 

<web-app>
   
   <filter>
        <filter-name>IE Filter</filter-name>
        <filter-class>com.ibm.devworks.filters.IEFilter</filter-class>
   </filter>
 
</web-app>

 

 

容器处理 web.xml 文件时,它通常为找到的每个过滤器定义创建一个过滤器实例。这一实例用来服务所有的可用 URL 请求;因此,以线程安全的方式编写过滤器是最为重要的。

过滤器映射及子元素
<filter-mapping> 标记代表了一个过滤器的映射,指定了过滤器会对其产生作用的 URL 的子集。它必须有一个 <filter-name> 子元素与能找到您希望映射的过滤器的过滤器定义相对应。

我们可以使用 <servlet-name><url-pattern> 子元素来指定映射。<servlet-name> 指定了一个过滤器应用的 servlet (在 web.xml 文件中的其它地方已定义)。

注意:在这里我们可以使用 <url-pattern> 来指定一个该过滤器应用的 URL 的子集。例如, /* 的样式用来代表该过滤器映射应用于该应用程序用到的每个 URL,/GL/ * 的样式则表明该过滤器映射只应用于总帐专有的 URL,而NT/*则表明过滤器只应用于非税专有的URL。

容器使用这些过滤器映射来确定一个特定的过滤器是否应参与某个特定的请求。清单 1 是为应用程序的所有 URL 定义的应用于 IE Filter 的一个过滤器映射:

清单 2. 过滤器映射标记

 

<filter-mapping>
        <filter-name>GL Filter</filter-name>
    <url-pattern>/GL/*</url-pattern>
</filter-mapping>
<filter-mapping>
        <filter-name>NT Filter</filter-name>
    <url-pattern>/NT/*</url-pattern>
</filter-mapping>

 

 

package freeview;

 

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import java.util.*;

 

/**

 * <p>Title: </p>

 * <p>Description: </p>

 * <p>Copyright: Copyright (c) 2003</p>

 * <p>Company: FreeView Stu.</p>

 * @author macken

 * @version 1.0

 */

 

public class NTFilterServlet extends HttpServlet implements Filter {

  private FilterConfig filterConfig;

  //Handle the passed-in FilterConfig

  public void init(FilterConfig filterConfig) {

    this.filterConfig = filterConfig;

  }

 

  //Process the request/response pair

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

       //权限控制代码

  }

  //Clean up resources

  public void destroy() {

  }

}

 

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

  <filter>

    <filter-name>filterservlet</filter-name>

    <filter-class>freeview.FilterServlet</filter-class>

  </filter>

  <filter-mapping>

    <filter-name>filterservlet</filter-name>

    <url-pattern>/NT/*</url-pattern>         ß--通过此描述说明只对NT部件进香权限控制过滤

  </filter-mapping>

  <listener>

    <listener-class>freeview.ListenerServlet</listener-class>

  </listener>

  <servlet>

    <servlet-name>debugjsp</servlet-name>

    <description>Added to compile JSPs with debug info</description>

    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>

    <init-param>

      <param-name>classdebuginfo</param-name>

      <param-value>true</param-value>

    </init-param>

    <load-on-startup>3</load-on-startup>

  </servlet>

  <servlet-mapping>

    <servlet-name>debugjsp</servlet-name>

    <url-pattern>*.jsp</url-pattern>

  </servlet-mapping>

</web-app>

 

 

用SERVLET过滤来实现权限控制

用SERVLET过滤来实现权限控制 阅读次数2697 出处 CN-JAVA原创:lastsky       用SERVLET过滤来实现权限控制简介过滤是S...
  • PhilLee
  • PhilLee
  • 2006年10月09日 10:12
  • 899

用SERVLET过滤来实现权限控制

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";...
  • java169
  • java169
  • 2008年05月24日 02:24
  • 249

Servlet学习(五)使用Servlet过滤器实现登录权限校验-附源码下载

使用过滤器来校验用户的登录状态, 在有些情况下,网站的部分网页是需要登录的用户才能访问的,那么该如何实现呢? 其实就是使用过滤器,在逻辑层加上一个过滤器来实现登录状态的校验,然后再将信息跳转到指定的界...
  • icarus_wang
  • icarus_wang
  • 2016年05月16日 09:18
  • 3031

java 使用过滤器控制用户访问权限

控制器类package com.crm.filter;import java.io.IOException;import java.io.PrintWriter;import javax.servle...
  • cndotaci
  • cndotaci
  • 2009年07月31日 00:34
  • 4653

使用Servlet Filter实现系统登录权限校验

Servlet Filter介绍过滤器是一些web应用程序组件,可以绑定到一个web应用程序中。但是与其他web应用程序组件不同的是,过滤器是”链”在容器的处理过程中的。这就意味着它们会在servle...
  • wtopps
  • wtopps
  • 2017年06月05日 19:16
  • 807

实现数据权限控制的一种方法

实现数据权限控制的一种方法[数据库是支持正则表达式的]
  • paincupid
  • paincupid
  • 2016年04月28日 15:38
  • 1850

Servlet实现字符编码过滤器

1:html       设置页面编码         通过Servlet设置页面编码                                  ...
  • pangqiandou
  • pangqiandou
  • 2016年10月26日 18:12
  • 1265

基于SpringAOP实现数据权限控制

基于SpringAOP实现数据权限控制 在此主要是实现对用户查询数据返回字段的控制。比如一个表格有A,B,C,D,E五列,用户U1只能查看A,B,C三列。 此文章讲述的内容并不能实现在查询时仅查询...
  • jaune161
  • jaune161
  • 2018年01月05日 19:24
  • 131

servlet+jsp实现过滤器,防止用户未登录访问

我们可能经常会用到这一功能,比如有时,我们不希望用户没有进行登录访问后台的操作页面,而且这样的非法访问会让系统极为的不安全,所以我们常常需要进行登录才授权访问其它页面,否则只会出现登录页面,当然我的思...
  • lsx991947534
  • lsx991947534
  • 2015年05月05日 10:20
  • 6670

Servlet Filter(过滤器)、Filter是如何实现拦截的、Filter开发入门

Servlet Filter(过滤器)、Filter是如何实现拦截的、Filter开发入门 Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开...
  • fengdongkun
  • fengdongkun
  • 2012年12月03日 19:02
  • 6571
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用SERVLET过滤来实现权限控制
举报原因:
原因补充:

(最多只允许输入30个字)