servletfilter(servletfilter顺序)

http://www.itjxue.com  2023-02-18 00:35  来源:未知  点击次数: 

servlet filter和springMVC拦截器的区别

过滤器和拦截器的区别:

①拦截器是基于Java的反射机制的,而过滤器是基于函数回调。

②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

过滤器是JavaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理。

2.SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。

servlet和filter加载冲突

你把struts1和struts2混在了一起,这样肯定有问题,见下面的分析:

首先filter在前面,所以任何一个url,只要匹配上url-pattern/*/url-pattern都会被过滤器拦住到

struts2 的org.apache.struts2.dispatcher.FilterDispatcher,然后会走struts2的相关Action。所以下面的struts1的servlet不会处理的。

可以去掉struts1的所有servlet,全部换成struts2的action,又或者放弃struts2的过滤器。

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-nameNoCacheFilter/filter-name

filter-classcom.xingyun.servlet.filter.NoCacheFilter/filter-class

/filter

filter-mapping

filter-nameNoCacheFilter/filter-name

url-pattern/*/url-pattern

/filter-mapping

至此,就实现了一个简单的用于禁用浏览器缓存的过滤器了。

上面说了这么多,在开发中哪些地方中能用到Filter才是最终目的,好了,我大概说一下我在开发中用到的地方。

①.上面提到的禁用浏览器的缓存。这个真的很重要,有时候修改了前端页面,就是因为缓存的原因,导致页面不 能及时刷新过来,真的很蛋疼。

②.解决中文乱码的问题。在开发中,页面可能达到几十个甚至上百个,在每个页面处理中文乱码的问题很烦,但 是通过过滤器,那么问题就变得很简单了。

③.通过检查用户是否登录来管理用户是否可以访问某些页面,比如个人隐私等页面。这个用的也是蛮多的。

servlet和filter的区别

一、概念:

1、servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。

2、filter:filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。

二、生命周期:

1、servlet:servlet的生命周期始于它被装入web服务器的内存时,并在web服务器终止或重新装入servlet时结束。servlet一旦被装入web服务器,一般不会从web服务器内存中删除,直至web服务器关闭或重新结束。

(1)、装入:启动服务器时加载Servlet的实例;

(2)、初始化:web服务器启动时或web服务器接收到请求时,或者两者之间的某个时刻启动。初始化工作有init()方法负责执行完成;

(3)、调用:从第一次到以后的多次访问,都是只调用doGet()或doPost()方法;

(4)、销毁:停止服务器时调用destroy()方法,销毁实例。

2、filter:(一定要实现javax.servlet包的Filter接口的三个方法init()、doFilter()、destroy(),空实现也行)

(1)、启动服务器时加载过滤器的实例,并调用init()方法来初始化实例;

(2)、每一次请求时都只调用方法doFilter()进行处理;

(3)、停止服务器时调用destroy()方法,销毁实例。

三、职责

1、servlet:

创建并返回一个包含基于客户请求性质的动态内容的完整的html页面;

创建可嵌入到现有的html页面中的一部分html页面(html片段);

读取客户端发来的隐藏数据;

读取客户端发来的显示数据;

与其他服务器资源(包括数据库和java的应用程序)进行通信;

通过状态代码和响应头向客户端发送隐藏数据。

2、filter:

filter能够在一个请求到达servlet之前预处理用户请求,也可以在离开servlet时处理http响应:

在执行servlet之前,首先执行filter程序,并为之做一些预处理工作;

根据程序需要修改请求和响应;

在servlet被调用之后截获servlet的执行

四、区别:

1,servlet 流程是短的,url传来之后,就对其进行处理,之后返回或转向到某一自己指定的页面。它主要用来在 业务处理之前进行控制.

2,filter 流程是线性的, url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等,而servlet 处理之后,不会继续向下传递。filter功能可用来保持流程继续按照原来的方式进行下去,或者主导流程,而servlet的功能主要用来主导流程。

filter可用来进行字符编码的过滤,检测用户是否登陆的过滤,禁止页面缓存等。

Servlet 之 Filter

原文地址:

description: "Filter 不仅能前置处理 Request,也能后置处理 Response,不过后置处理时,要注意 Response 一旦被提交了,就不能再被修改了"

date: 2021.10.17 10:34

categories:

- Java

tags: [Servlet]

keywords: Servlet, filter, response is commited

原文地址:

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,不能再设置请求头

,原因是当响应被提交时,这意味着标头已经发送到客户端,无法设置或者更改标头。

(责任编辑:IT教学网)

更多

推荐网页制作视频教程文章