servletfilter(servletfilter顺序)
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,不能再设置请求头
,原因是当响应被提交时,这意味着标头已经发送到客户端,无法设置或者更改标头。