㈠ java web 过滤器跟拦截器的区别和使用
过滤器(filter):就是对请求起到过滤的作用,它在监听器之后,作用在servlet之前,对请求进行过滤。
拦截器(interceptor):就是对请求和返回进行拦截,它作用在servlet的内部,具体来说有三个地方:servlet_1和servlet_2之间,即请求还没有到controller层。servlet_2和servlet_3之间,即请求走出controller层次,还没有到渲染时图层。servlet_3和servlet_4之间,即结束视图渲染,但是还没有到servlet的结束。
它们之间的关系,可以用一张图来表示:
㈡ servlet过滤器的作用
在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。
根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。
在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。
根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。
过滤器的一些常见应用:
1:认证过滤:对用户请求进行统一的认证。
2:登录和审核过滤:对用户的访问请求进行记录和审核。
3:图像转换过滤:转换图像格式。
4:数据压缩过滤 :对用户发生的数据进行压缩,从而减少传输量。
5:加密过滤:对请求和响应进行加密解密处理。
6:令牌过滤
7:资源访问触发事件过滤
8:XSLT过滤
9:MIME-type过滤
㈢ Servlet过滤器是什么
在 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过滤器是小型的 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过滤器的确要经历三个步骤。
㈣ java web 过滤器跟拦截器的区别和使用
区别如下:
1 、拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2 、拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3 、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4 、拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5 、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
使用如下:
在Servlet作为过滤器使用时,它可以对客户的请求进行处理。处理完成后,它会交给下一个过滤器处理,这样,客户的请求在过滤链里逐个处理,直到请求发送到目标为止。例如,某网站里有提交“修改的注册信息”的网页,当用户填写完修改信息并提交后,服务器在进行处理时需要做两项工作:判断客户端的会话是否有效;对提交的数据进行统一编码。
这两项工作可以在由两个过滤器组成的过滤链里进行处理。当过滤器处理成功后,把提交的数据发送到最终目标;如果过滤器处理不成功,将把视图派发到指定的错误页面。
(4)servlet过滤器有什么用扩展阅读:
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。
㈤ 请说明servlet过滤器的用途
Filter,过滤器,顾名思义,即是对数据等的过滤,预处理过程。为什么要引入过滤器呢?在平常访问网站的时候,有时候发一些敏感的信息,发出后显示时 就会将敏感信息用*等字符替代,这就是用过滤器对信息进行了处理。这只是一个简单的例子,当然,过滤器那么强大,它的功能也不可能局限于此,它不仅能预处 理数据,只要是发送过来的请求它都是可以预处理的,同时,它还可以对服务器返回的响应进行预处理,这样,大大减轻了服务器的压力。例如,实现URL级别的 权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
过滤作用,对从客户端向服务器端发送的请求进行过滤,也可以对服务器端返回的响应进行处理。它使用户可以改变一个request和修改一个 response.。Filter 不是一个servlet,它不能产生一个response,但是它能够在一个request到达servlet之前预处理request,也可以在 response离开servlet时处理response。换句话说,filter其实是客户端与servlet中间的一个传递者,并且它可以对要传递 的东西进行修改。
㈥ Java面试题:过滤器有哪些作用和用法
Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。
可以回将一个或多个 Servlet 过滤器附答加到一个 Servlet 或一组 Servlet。Servlet 过滤器也可以附加到 JavaServer Pages (JSP) 文件和 HTML 页面。调用 Servlet 前调用所有附加的 Servlet 过滤器。
Servlet 过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:
在客户端的请求访问后端资源之前,拦截这些请求。
在服务器的响应发送回客户端之前,处理这些响应。
㈦ jsp/servlet过滤器和struts2拦截器的有什么区别
拦截器和过滤器的区别:
1、拦截器是基于java的反射机制的,而过滤器是基于函数回调
2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能
5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
拦截器
:是在面向切面编程的就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。
下面通过实例来看一下过滤器和拦截器的区别:
使用拦截器进行/admin 目录下jsp页面的过滤
[html] view plain
<package name="newsDemo"
extends="struts-default"
namespace="/admin">
<interceptors>
<interceptor name="auth"
class="com.test.news.util.AccessInterceptor" />
<interceptor-stack name="authStack">
<interceptor-ref
name="auth" />
</interceptor-stack>
</interceptors>
<!-- action -->
<action name="newsAdminView!*" class="newsAction"
method="{1}">
<interceptor-ref
name="defaultStack"/>
<interceptor-ref
name="authStack">
</interceptor-ref>
下面是我实现的Interceptor class:
[java] view plain
package com.test.news.util;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import
com.opensymphony.xwork2.ActionInvocation;
import
com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import
com.test.news.action.AdminLoginAction;
/**
*
@author chaoyin
*/
public class AccessInterceptor
extends AbstractInterceptor {
private static final long
serialVersionUID = -4291195782860785705L;
@Override
public String intercept(ActionInvocation actionInvocation) throws
Exception {
ActionContext actionContext =
actionInvocation.getInvocationContext();
Map session =
actionContext.getSession();
//except login action
Object action = actionInvocation.getAction();
if (action
instanceof AdminLoginAction) {
return
actionInvocation.invoke();
}
//check
session
if(session.get("user")==null ){
return
"logout";
}
return actionInvocation.invoke();//go
on
}
}
过滤器:是在javaweb中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的
action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者
struts的action前统一设置字符集,或者去除掉一些非法字符。
使用过滤器进行/admin
目录下jsp页面的过滤,首先在web.xml进行过滤器配置:
[html] view plain
<filter>
<filter-name>access
filter</filter-name>
<filter-class>
com.test.news.util.AccessFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>access filter</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
下面是过滤的实现类:
[java] view
plain
package com.test.news.util;
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.HttpSession;
public class AccessFilter
implements Filter {
/**
* @author chaoyin
*/
public void destroy() {
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
HttpSession session = request.getSession();
if(session.getAttribute("user")== null &&
request.getRequestURI()。indexOf("login.jsp")==-1 ){
response.sendRedirect("login.jsp");
return ;
}
filterChain.doFilter(arg0, arg1);
}
public void init(FilterConfig arg0) throws ServletException {
}
}
摘自网络--
㈧ servlet中filter有什么用
首先介绍一下Filter到底是个什么东西:
根据这个单词就能猜到Filter的中文意思是过滤器,事实当然也是这样的;Filter是Servlet中的一个重 要组件。
接下来简单说说Filter这个接口中的常用方法吧。
①.init():类似于Servlet生命周期中的init()方法,用于初始化一些关于Filter接口的参数;只在Servlet 启动时调用一次。
②.doFilter():类似于Servlete生命周期中的service()方法,该方法用于存放逻辑代码。
③.destory():同理类似于Servlet生命周期中的destroy()方法,当Servlet容器销毁前调用该方法。
然后说说如何创建一个Filter的HelloWorld。
①.创一个抽象的Java类,该类实现了Filter接口,同时实现了Filter接口的部分方法,例如
init(),destroy()方法。具体实现代码如下:
public abstract class HttpFilter implements Filter {
private HttpServletRequest request;
private HttpServletResponse response;
//重写Filter接口的destory方法
public void destroy() {}
//重写doFilter方法,这个方法在这里主要作用是将ServletRequest,ServletResponse对象转为对 //应的HttpServletRequest,HttpServletResponse对象
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
this.request = (HttpServletRequest) arg0;
this.response = (HttpServletResponse) arg1;
doFilter(request, response, arg2);
}
//该方法交由继承该抽象类的实现类来实现
public abstract void doFilter(HttpServletRequest request,HttpServletResponse response,
FilterChain chain);
private FilterConfig config;
//这个方法是为了方便子类获取ServletContext对象
public FilterConfig getFilterConfig(){
return config;
}
//该方法一般不建议重写,因为重写该方法会出现某些错,基于此提供了下面的无参数的init()方法
public void init(FilterConfig arg0) throws ServletException {
this.config = arg0;
init();
}
public void init(){}
}
②.一个继承了HttpFilter抽象类的实现类,代码如下,只要功能是为了实现禁用浏览器缓存
public class NoCacheFilter extends HttpFilter{
@Override
public void doFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain chain) {
//通过过滤器实现页面禁用浏览器缓存
response.setDateHeader("Expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
}
}
③.将该实现类配置到web.xml文件中,配置方式和配置普通的Servlet一样,具体代码
<filter>
<filter-name>NoCacheFilter</filter-name>
<filter-class>com.xingyun.servlet.filter.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NoCacheFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
至此,就实现了一个简单的用于禁用浏览器缓存的过滤器了。
上面说了这么多,在开发中哪些地方中能用到Filter才是最终目的,好了,我大概说一下我在开发中用到的地方。
①.上面提到的禁用浏览器的缓存。这个真的很重要,有时候修改了前端页面,就是因为缓存的原因,导致页面不 能及时刷新过来,真的很蛋疼。
②.解决中文乱码的问题。在开发中,页面可能达到几十个甚至上百个,在每个页面处理中文乱码的问题很烦,但 是通过过滤器,那么问题就变得很简单了。
③.通过检查用户是否登录来管理用户是否可以访问某些页面,比如个人隐私等页面。这个用的也是蛮多的。