‘壹’ java项目和web项目中的过滤器文件怎么使用
过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。在这之后,过滤器可以作如下的选择:
1. 以常规的方式调用资源(即,调用servlet或JSP页面)。
2.利用修改过的请求信息调用资源。
3. 调用资源,但在发送响应到客户机前对其进行修改
4. 阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。
1. 建立基本过滤器
建立一个过滤器涉及下列五个步骤:
1)建立一个实现Filter接口的类。这个类需要三个方法,分别是:doFilter、init和destroy。
doFilter方法包含主要的过滤代码(见第2步),init方法建立设置操作,而destroy方法进行清楚。
2)在doFilter方法中放入过滤行为。doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息(包括表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过滤器中忽略此参数。最后一个参数为FilterChain,如下一步所述,此参数用来调用servlet或JSP页。
3)调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作为它的一个参数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。
4)对相应的servlet和JSP页面注册过滤器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。
5)禁用激活器servlet。防止用户利用缺省servlet URL绕过过滤器设置。
1.1 建立一个实现Filter接口的类
所有过滤器都必须实现javax.servlet.Filter。这个接口包含三个方法,分别为doFilter、init和destroy。
public void doFilter(ServletRequset request,
ServletResponse response,
FilterChain chain)
thows ServletException, IOException
每当调用一个过滤器(即,每次请求与此过滤器相关的servlet或JSP页面)时,就执行其doFilter方法。正是这个方法包含了大部分过滤逻辑。第一个参数为与传入请求有关的ServletRequest。对于简单的过滤器,大多数过滤逻辑是基于这个对象的。如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中无法得到的方法,就要把此对象构造成HttpServletRequest。
第二个参数为ServletResponse。除了在两个情形下要使用它以外,通常忽略这个参数。首先,如果希望完全阻塞对相关servlet或JSP页面的访问。可调用response.getWriter并直接发送一个响应到客户机。其次,如果希望修改相关的servlet或JSP页面的输出,可把响应包含在一个收集所有发送到它的输出的对象中。然后,在调用serlvet或JSP页面后,过滤器可检查输出,如果合适就修改它,之后发送到客户机。
DoFilter的最后一个参数为FilterChain对象。对此对象调用doFilter以激活与servlet或JSP页面相关的下一个过滤器。如果没有另一个相关的过滤器,则对doFilter的调用激活servlet或JSP本身。
public void init(FilterConfig config) thows ServletException
init方法只在此过滤器第一次初始化时执行,不是每次调用过滤器都执行它。对于简单的过滤器,可提供此方法的一个空体,但有两个原因需要使用init。首先,FilterConfig对象提供对servlet环境及web.xml文件中指派的过滤器名的访问。因此,普遍的办法是利用init将FilterConfig对象存放在一个字段中,以便doFilter方法能够访问servlet环境或过滤器名.其次,FilterConfig对象具有一个getInitParameter方法,它能够访问部署描述符文件(web.xml)中分配的过滤器初始化参数。
public void destroy( )
大多数过滤器简单地为此方法提供一个空体,不过,可利用它来完成诸如关闭过滤器使用的文件或数据库连接池等清除任务。
1.2 将过滤行为放入doFilter方法
doFilter方法为大多数过滤器地关键部分。每当调用一个过滤器时,都要执行doFilter。对于大多数过滤器来说,doFilter执行的步骤是基于传入的信息的。因此,可能要利用作为doFilter的第一个参数提供的ServletRequest。这个对象常常构造为HttpServletRequest类型,以提供对该类的更特殊方法的访问。
1.3 调用FilterChain对象的doFilter方法
Filter接口的doFilter方法以一个FilterChain对象作为它的第三个参数。在调用该对象的doFilter方法时,激活下一个相关的过滤器。这个过程一般持续到链中最后一个过滤器为止。在最后一个过滤器调用其FilterChain对象的doFilter方法时,激活servlet或页面自身。
但是,链中的任意过滤器都可以通过不调用其FilterChain的doFilter方法中断这个过程。在这样的情况下,不再调用JSP页面的serlvet,并且中断此调用过程的过滤器负责将输出提供给客户机。
1.4 对适当的servlet和JSP页面注册过滤器
部署描述符文件的2.3版本引入了两个用于过滤器的元素,分别是:filter和filter-mapping。filter元素向系统注册一个过滤对象,filter-mapping元素指定该过滤对象所应用的URL。
下面是一个完整的例子:
//建立一个实现Filter接口的类。这个类需要三个方法,分别是:doFilter、init和destroy。
//doFilter方法包含主要的过滤代码,init方法建立设置操作,而destroy方法进行清
package filterpkg;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class testFilter implements Filter{
public void init(FilterConfig filterConfig) throws ServletException
{
}
//在doFilter方法中放入过滤行为。doFilter方法的第一个参数为ServletRequest对象。
//此对象给过滤器提供了对进入的信息(包括表单数据、cookie和HTTP请求头)的完全访问。
//第二个参数为ServletResponse,通常在简单的过滤器中忽略此参数。
//最后一个参数为FilterChain,如下一步所述,此参数用来调用servlet或JSP页。
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain)
{
PrintWriter wout=null;
try
{
wout=response.getWriter();
}
catch(IOException e)
{
}
HttpServletRequest req=(HttpServletRequest)request;//将request转化为它的子类HttpServletRequest
String uri=req.getRequestURI();//获得传入的URI
if (uri.indexOf("MyJsp.jsp")>0 ||uri.indexOf("MainForm.do")>0 )//如果是我们指定的登录页面或验证页面
{
try
{
//调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作为它的一个参数。
//在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。
filterChain.doFilter(request, response);
}
catch(Exception e)
{
}
return;
}
if (req.getSession()!=null)
if (req.getSession().getAttribute("USERID")==null)
{
wout.write("<HTML><BODY> Check error! <br/> </BODY> </HTML>");
wout.flush();
return;
}
try
{
filterChain.doFilter(request, response);
}
catch(Exception e)
{
}
}
public void destroy()
{
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>CHECKCODE</filter-name>
<filter-class>filterpkg.testFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CHECKCODE</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>ControlServlet</servlet-name>
<servlet-class>filterpkg.ControlServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ControlServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
‘贰’ java过滤器filter能过滤某个包下的所有servlet吗
不能直接过滤。过滤器是根据URL路径来过滤的,不是根据包名来拦截的。但是你可以按照这样的规则配置你的web.xml文件,间接实现你的需求。
① 你的servlet的访问路径,根据包名来命名。设计二级路径。比如你有一个user.servlet包。你可以把里面的所有Servlet路径全部设置为/user/xxxServlet。你的filter拦截路径就改为
/user/*
//1AServlet代码
packageuser.servlet;
importjava.io.IOException;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
{
protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
doPost(request,response);
}
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
System.out.println(456);
}
}
//2BServlet代码
packageuser.servlet;
importjava.io.IOException;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
{
protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
doPost(request,response);
}
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
System.out.println(123);
}
}
//3filter代码
packagefilter;
importjava.io.IOException;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
{
@Override
publicvoiddestroy(){}
@Override
publicvoiddoFilter(ServletRequestarg0,ServletResponsearg1,
FilterChainarg2)throwsIOException,ServletException{
System.out.println("执行了"+arg0.getParameter("name"));
arg2.doFilter(arg0,arg1);
}
@Override
publicvoidinit(FilterConfigarg0)throwsServletException{}
}
//4web.xml配置
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>user.servlet.AServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/user/AServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Bservlet</servlet-name>
<servlet-class>user.servlet.BServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Bservlet</servlet-name>
<url-pattern>/user/BServlet</url-pattern>
</servlet-mapping>
<filter>
<filter-name>Myfilter</filter-name>
<filter-class>filter.Myfilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Myfilter</filter-name>
<url-pattern>/user/*</url-pattern>
</filter-mapping>
//5测试我的工程应用名是HelloWorld
http://localhost/HelloWorld/user/AServlet?name=aaa
http://localhost/HelloWorld/user/BServlet?name=bbb
会发现控制台分别打印出取出的参数aaa和bbb证明。拦截成功。
‘叁’ Servlet 之 Filter
原文地址: https://wyiyi.github.io/amber/2021/10/01/filter/
description: "Filter 不仅能前置处理 Request,也能后置处理 Response,不过后置处理时,要注意 Response 一旦被提交了,就不能再被修改了"
date: 2021.10.17 10:34
categories:
- Java
tags: [Servlet]
keywords: Servlet, filter, response is commited
原文地址: https://wyiyi.github.io/amber/2021/10/01/filter/
Servlet 作为Java Web 的基础,在 Servlet API 中提供了一个 Filter 接口,Filter,又称过滤器。
所谓过滤器顾名思义是用来过滤的,可以从客户端向服务端发送请求进行过滤,也可以对服务器返回响应进行处理。
根据上面的流程可以看出,Filter的作用就是在用户请求到达Servlet之前,进行拦截。在拦截到用户的请求后,我们可以实现一些自定义的业务逻辑。
例如:实现URL级别的权限访问控制(最常用)、字符编码、登录限制、过滤敏感词汇、文件压缩,跨域设置等一些高级功能。
Filter 与 Servlet 一样都是由服务器负责创建和销毁的,Filter 只会被创建和销毁一次,doFilter 可以执行多次。
将 Java 类实现 javax.servlet.Filter 接口,重写 doFilter() 方法(init(),destroy() 也可重写)
1、通过传统的 web.xml 方式注册。
2、注解方式: @WebFilter,该方式是 web3.0 提供的注解,代替在 web.xml 文件中配置 filter,简化了开发。
1、在 chain.doFilter 中使用 @WebFilter 注解,会按照类名的字典顺序执行
以 AFilter 、 BFilter 、 CFilter 为例,执行的过滤器的顺序输出为:
2、调整 FilterChain 的执行顺序
由于注解 @WebFilter 的源码(如下)中没有参数指定顺序,但是在Spring中提供了 @Order 注解可以指定Filter的执行顺序。
执行的过滤器的顺序输出为:
3、设置请求或响应(Request、Response)
【注意】: Filter chain.doFilter 之后 response is committed,不能再设置请求头
,原因是当响应被提交时,这意味着标头已经发送到客户端,无法设置或者更改标头。
‘肆’ 什么是java过滤器! 它的功能和作用是什么啊
Servlet API 很久以前就已成为企业应用开发的基石,而 Servlet 过滤器则是对 J2EE 家族的相对较新的补充。在 J2EE 探索者 系列文章的最后一篇中,作者 Kyle Gabhart 将向您介绍 Servlet 过滤器体系结构,定义过滤器的许多应用,并指导您完成典型过滤器实现的三个步骤。他还会透露 bean 的一些激动人心的变化,预计刚发布的 Java Servlet 2.4 规范会引入这些变化。
Servlet 过滤器是可插入的 Web 组件,它允许我们实现 Web 应用程序中的预处理和后期处理逻辑。过滤器支持 servlet 和 JSP 页面的基本请求处理功能,比如日志记录、性能、安全、会话处理、XSLT 转换,等等。 过滤器最初是随 Java Servlet 2.3 规范发布的,最近定稿的 2.4 规范对它进行了重大升级。在这 J2EE 探索者 系列文章的最后一篇中,我将向您介绍 Servlet 过滤器的基础知识 —— 比如总体的体系结构设计、实现细节,以及在 J2EE Web 应用程序中的典型应用,还会涉及一些预计最新的 Servlet 规范将会提供的扩展功能。
Servlet 过滤器是什么?
Servlet 过滤器是小型的 Web 组件,它们拦截请求和响应,以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。过滤器是通常封装了一些功能的 Web 组件,这些功能虽然很重要,但是对于处理客户机请求或发送响应来说不是决定性的。典型的例子包括记录关于请求和响应的数据、处理安全协议、管理会话属性, 等等。过滤器提供一种面向对象的模块化机制,用以将公共任务封装到可插入的组件中,这些组件通过一个配置文件来声明,并动态地处理。
Servlet 过滤器中结合了许多元素,从而使得过滤器成为独特、强大和模块化的 Web 组件。也就是说,Servlet 过滤器是:
声明式的:过滤器通过 Web 部署描述符(web.xml)中的 XML 标签来声明。这样允许添加和删除过滤器,而无需改动任何应用程序代码或 JSP 页面。
动态的:过滤器在运行时由 Servlet 容器调用来拦截和处理请求和响应。
灵活的:过滤器在 Web 处理环境中的应用很广泛,涵盖诸如日志记录和安全等许多最公共的辅助任务。过滤器还是灵活的,因为它们可用于对来自客户机的直接调用执行预处理和后期处 理,以及处理在防火墙之后的 Web 组件之间调度的请求。最后,可以将过滤器链接起来以提供必需的功能。
模块化的:通过把应用程序处理逻辑封装到单个类文件中,过滤器从而定义了可容易地从请求/响应链中添加或删除的模块化单元。
可移植的:与 Java 平台的其他许多方面一样,Servlet 过滤器是跨平台和跨容器可移植的,从而进一步支持了 Servler 过滤器的模块化和可重用本质。
可重用的:归功于过滤器实现类的模块化设计,以及声明式的过滤器配置方式,过滤器可以容易地跨越不同的项目和应用程序使用。
透明的:在请求/响应链中包括过滤器,这种设计是为了补充(而不是以任何方式替代)servlet 或 JSP 页面提供的核心处理。因而,过滤器可以根据需要添加或删除,而不会破坏 servlet 或 JSP 页面。
所以 Servlet 过滤器是通过一个配置文件来灵活声明的模块化可重用组件。过滤器动态地处理传入的请求和传出的响应,并且无需修改应用程序代码就可以透明地添加或删除它 们。最后,过滤器独立于任何平台或者 Servlet 容器,从而允许将它们容易地部署到任何相容的 J2EE 环境中。
在接下来的几小节中,我们将进一步考察 Servlet 过滤器机制的总体设计,以及实现、配置和部署过滤器所涉及的步骤。我们还将探讨 Servlet 过滤器的一些实际应用,最后简要考察一下模型-视图-控制器(MVC)体系结构中包含的 Servlet 过滤器,从而结束本文的讨论。
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 页面之间。这才是我所称的强大能力和灵活性!
实现一个 Servlet 过滤器
他们说“好事多磨”。我不知道“他们”指的是谁,或者这句古老的谚语究竟有多真实,但是实现一个 Servlet 过滤器的确要经历三个步骤。首先要编写过滤器实现类的程序,然后要把该过滤器添加到 Web 应用程序中(通过在 Web 部署描述符 /web.xml 中声明它),最后要把过滤器与应用程序一起打包并部署它。我们将详细研究这其中的每个步骤。
1. 编写实现类的程序
过滤器 API 包含 3 个简单的接口(又是数字 3!),它们整洁地嵌套在 javax.servlet 包中。那 3 个接口分别是 Filter、FilterChain 和 FilterConfig。从编程的角度看,过滤器类将实现 Filter 接口,然后使用这个过滤器类中的 FilterChain 和 FilterConfig 接口。该过滤器类的一个引用将传递给 FilterChain 对象,以允许过滤器把控制权传递给链中的下一个资源。FilterConfig 对象将由容器提供给过滤器,以允许访问该过滤器的初始化数据。
为了与我们的三步模式保持一致,过滤器必须运用三个方法,以便完全实现 Filter 接口:
init():这个方法在容器实例化过滤器时被调用,它主要设计用于使过滤器为处理做准备。该方法接受一个 FilterConfig 类型的对象作为输入。
doFilter():与 servlet 拥有一个 service() 方法(这个方法又调用 doPost() 或者 doGet())来处理请求一样,过滤器拥有单个用于处理请求和响应的方法——doFilter()。这个方法接受三个输入参数:一个 ServletRequest、response 和一个 FilterChain 对象。
destroy():正如您想象的那样,这个方法执行任何清理操作,这些操作可能需要在自动垃圾收集之前进行。展示了一个非常简单的过滤器,它跟踪满足一个客户机的 Web 请求所花的大致时间。
一个过滤器类实现
import javax.servlet.*;
import java.util.*;
import java.io.*;
public class TimeTrackFilter implements Filter {
private FilterConfig filterConfig = null;
public void init(FilterConfig filterConfig)
throws ServletException {
this.filterConfig = filterConfig;
}
public void destroy() {
this.filterConfig = null;
}
public void doFilter( ServletRequest request,
ServletResponse response, FilterChain chain )
throws IOException, ServletException {
Date startTime, endTime;
double totalTime;
startTime = new Date();
// Forward the request to the next resource in the chain
chain.doFilter(request, wrapper);
// -- Process the response -- \\
// Calculate the difference between the start time and end time
endTime = new Date();
totalTime = endTime.getTime() - startTime.getTime();
totalTime = totalTime / 1000; //Convert from milliseconds to seconds
StringWriter sw = new StringWriter();
PrintWriter writer = new PrintWriter(sw);
writer.println();
writer.println("===============");
writer.println("Total elapsed time is: " + totalTime + " seconds." );
writer.println("===============");
// Log the resulting string
writer.flush();
filterConfig.getServletContext().
log(sw.getBuffer().toString());
}
}
复制代码
这个过滤器的生命周期很简单,不管怎样,我们还是研究一下它吧:
初始化
当容器第一次加载该过滤器时,init() 方法将被调用。该类在这个方法中包含了一个指向 FilterConfig 对象的引用。我们的过滤器实际上并不需要这样做,因为其中没有使用初始化信息,这里只是出于演示的目的。
过滤
过滤器的大多数时间都消耗在这里。doFilter() 方法被容器调用,同时传入分别指向这个请求/响应链中的 ServletRequest、ServletResponse 和 FilterChain 对象的引用。然后过滤器就有机会处理请求,将处理任务传递给链中的下一个资源(通过调用 FilterChain 对象引用上的 doFilter()方法),之后在处理控制权返回该过滤器时处理响应。
析构
容器紧跟在垃圾收集之前调用 destroy() 方法,以便能够执行任何必需的清理代码。
2. 配置 Servlet 过滤器
过滤器通过 web.xml 文件中的两个 XML 标签来声明。<filter> 标签定义过滤器的名称,并且声明实现类和 init() 参数。<filter-mapping> 标签将过滤器与 servlet 或 URL 模式相关联。
摘自一个 web.xml 文件,它展示了如何声明过滤器的包含关系:
在 web.xml 中声明一个过滤器
<filter>
<filter-name>Page Request Timer</filter-name>
<filter-class>TimeTrackFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Page Request Timer</filter-name>
<servlet-name>Main Servlet</servlet-name>
</filter-mapping>
<servlet>
<servlet-name>Main Servlet</servlet-name>
<servlet-class>MainServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Main Servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
复制代码
上 面的代码示例声明了一个过滤器("Page Request Timer"),并把它映射到一个 servlet("Main Servlet")。然后为该 servlet 定义了一个映射,以便把每个请求(由通配符指定)都发送到该 servlet。这是控制器组件的典型映射声明。您应该注意这些声明的顺序,因为千万不能背离这些元素的顺序。
3. 部署 Servlet 过滤器
事实上,与 Web 应用程序一起部署过滤器绝对不涉及任何复杂性。只需把过滤器类和其他 Web 组件类包括在一起,并像您通常所做的那样把 web.xml 文件(连同过滤器定义和过滤器映射声明)放进 Web 应用程序结构中,servlet 容器将处理之后的其他所有事情。
过滤器的许多应用
您在 J2EE Web 应用程序中利用过滤器的能力,仅受到您自己的创造性和应用程序设计本领的限制。在适合使用装饰过滤器模式或者拦截器模式的任何地方,您都可以使用过滤器。过滤器的一些最普遍的应用如下:
加载:对于到达系统的所有请求,过滤器收集诸如浏览器类型、一天中的时间、转发 URL 等相关信息,并对它们进行日志记录。
性能:过滤器在内容通过线路传来并在到达 servlet 和 JSP 页面之前解压缩该内容,然后再取得响应内容,并在将响应内容发送到客户机机器之前将它转换为压缩格式。
安全:过滤器处理身份验证令牌的管理,并适当地限制安全资源的访问,提示用户进行身份验证和/或将他们指引到第三方进行身份验证。过滤器甚至能够管理访问 控制列表(Access Control List,ACL),以便除了身份验证之外还提供授权机制。将安全逻辑放在过滤器中,而不是放在 servlet 或者 JSP 页面中,这样提供了巨大的灵活性。在开发期间,过滤器可以关闭(在 web.xml 文件中注释掉)。在生产应用中,过滤器又可以再次启用。此外还可以添加多个过滤器,以便根据需要提高安全、加密和不可拒绝的服务的等级。
会话处理:将 servlet 和 JSP 页面与会话处理代码混杂在一起可能会带来相当大的麻烦。使用过滤器来管理会话可以让 Web 页面集中精力考虑内容显示和委托处理,而不必担心会话管理的细节。
XSLT 转换:不管是使用移动客户端还是使用基于 XML 的 Web 服务,无需把逻辑嵌入应用程序就在 XML 语法之间执行转换的能力都绝对是无价的。
使过滤器适应 MVC 体系结构
模型-视图-控制器(Model-View-Controller,MVC)体系结构是一个有效的设计,它现在已作为最重要的设计方法学,整合到了诸如 Jakarta Struts 和 Turbine 等大多数流行的 Web 应用框架中。过滤器旨在扩充 MVC 体系结构的请求/响应处理流。不管请求/响应发生在客户机和服务器之间,还是发生在服务器上的其他组件之间,过滤器在处理流中的应用都是相同的。从 MVC 的观点看,调度器组件(它或者包括在控制器组件中,或者配合控制器组件工作)把请求转发给适当的应用程序组件以进行处理。这使得控制器层成为包括 Servlet 过滤器的最佳位置。通过把过滤器放在控制器组件本身的前面,过滤器可以应用于所有请求,或者通过将它放在控制器/调度器与模型和控制器之间,它可以应用于 单独的 Web 组件。
MVC 体系结构广为传播,并具有良好的文档。请通过 参考资料 中的链接了解关于 MVC 和 MVC 体系结构中的 Servlet 实现的更多信息。
结束语
虽然过滤器才出现几年时间,但它们本身已作为一个关键组件嵌入到了所有敏捷的、面向对象的 J2EE Web 应用程序中。本文向您介绍了 Servlet 过滤器的使用。本文讨论了过滤器的高级设计,比较了当前规范(2.4)和以前(2.3)的模型,讲述了实现过滤器所涉及的精确步骤,以及如何在 Web 应用程序中声明过滤器,然后与应用程序一起部署它。本文还阐述了 Servlet 过滤器的一些最普遍应用,并提到了过滤器如何适应传统的 MVC 体系结构。
这是 J2EE 探索者 系列的最后一篇文章。我们在年初通过粗略研究 Enterprise JavaBean 组件来开始我们的旅程,并提到了何时使用这些组件才真正有意义,以及何时这些组件才会变得大材小用的问题。然后我们将目光转向了 Web 层,绘制了一条通过 Servlet、JSP 页面、JavaBean 技术以及 Java Servlet API 中的无数选择和功能的路径。在这个系列文章中与您一起艰苦跋涉真是一件快乐的事情。我享受着编写这个系列文章的乐趣,并且我从大家的反馈中知道,这对您也 是一个很有价值的过程。
Java 过滤器的作用
‘伍’ Java面试题:过滤器有哪些作用和用法
Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。
可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet。Servlet 过滤器也可以附加到 JavaServer Pages (JSP) 文件和 HTML 页面。调用 Servlet 前调用所有附加的 Servlet 过滤器。
Servlet 过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:
在客户端的请求访问后端资源之前,拦截这些请求。
在服务器的响应发送回客户端之前,处理这些响应。
‘陆’ java web 过滤器跟拦截器的区别和使用
区别如下:
1 、拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2 、拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3 、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4 、拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5 、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
使用如下:
在Servlet作为过滤器使用时,它可以对客户的请求进行处理。处理完成后,它会交给下一个过滤器处理,这样,客户的请求在过滤链里逐个处理,直到请求发送到目标为止。例如,某网站里有提交“修改的注册信息”的网页,当用户填写完修改信息并提交后,服务器在进行处理时需要做两项工作:判断客户端的会话是否有效;对提交的数据进行统一编码。
这两项工作可以在由两个过滤器组成的过滤链里进行处理。当过滤器处理成功后,把提交的数据发送到最终目标;如果过滤器处理不成功,将把视图派发到指定的错误页面。
(6)javaservlet过滤扩展阅读:
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。
‘柒’ Java Servlet程序的过滤器,如下选项,哪些数据不在过滤器拦截范围内 A. reques
这几个选项都可以在过滤器的拦截范围内,
过滤器要拦截什么完全取决你自己如何实现Filter接口的如下方法
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
在该方法中你可以根据request获取上面4个数据进行拦截。
推荐你看下”轻量级java ee企 业应用实战“这本书,你会知道Filter怎么实现,怎么用。
然后你就会发现你这个题目有多么荒诞了。