Servlet & JSP - Filter
过滤器可以对用户的请求拦截,进行预处理操作,接着将请求交给 Servlet 处理并生成响应,最后再对响应拦截,进行后处理操作。过滤器应用的场景有:用户登录、加密解密、会话校验等。
Filter API
过滤器必须继承 javax.servlet.Filter 接口。Filter 接口暴露三个生命周期方法:init、doFilter 和 destroy。
init: 当容器将过滤器引入服务的时候(通常是应用启动的时候),init 方法会被调用。Servlet 容器调用 init 方法时会传入一个 javax.servlet.FilterConfig 参数。FilterConfig 包含了过滤器的配置信息,如过滤器的名称、初始化参数、上下文环境等。
doFilter: 当过滤器关联的资源被请求时,doFilter 方法会被调用。doFilter 方法接收三个参数:ServletRequest、ServletResponse 和 FilterChain。ServletRequest 和 ServletResponse 是被拦截的请求和响应对象,我们可以对其做一些处理,如对请求设置属性或者在响应添加 HTTP 首部,甚至是使用装饰器来改变请求和响应的行为。调用 FilterChain 的 doFilter 方法将请求和响应传递至过滤器链的下一个过滤器或目标资源。在 filterChain.doFilter(request, response) 方法调用之前的操作是预处理,在 filterChain.doFilter(request, response) 方法调用之后的操作是后处理。
destroy: 当容器将过滤器移出服务的时候(通常是应用停止的时候),destroy 方法会被调用。
配置过滤器
1. 使用部署描述符配置:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.huey.hello.filters.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2. 在 Servlet3.0 可以使用 @WebFilter 注解配置:
@WebFilter(filterName = "myFilter", urlPatterns = {"/*"})
public class MyFilter implements Filter {
// ...
}
过滤器的作用顺序
当多个过滤器作用在同一资源时,过滤器的作用顺序由其在部署描述符中的声明顺序决定,使用 @WebFilter 注解无法指定作用顺序。假设有 Filter1 和 Filter2 作用在同一个资源,且 Filter1 在 Filter2 之前声明,那么作用顺序为:Filter1 的预处理 ---> Filter2 的预处理 ---> 目标资源的处理 ---> Filter2 的后处理 ---> Filter1 的后处理。
应用示例
package com.huey.hello.filters; 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.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest; import com.huey.hello.wrapper.CharsetServletRequestWrapper; /**
* 使用注解配置 Filter
* urlPatterns 配置关联的目标资源
* initParams 配置初始参数
*/
@WebFilter(filterName="charsetFilter", urlPatterns = {"/*"},
initParams = {
@WebInitParam(name = "oldCharset", value = "ISO-8859-1"),
@WebInitParam(name = "newCharset", value = "UTF-8"),
})
public class CharsetFilter implements Filter { private String oldCharset;
private String newCharset; @Override
public void init(FilterConfig filterConfig) throws ServletException {
oldCharset = filterConfig.getInitParameter("oldCharset");
newCharset = filterConfig.getInitParameter("newCharset");
} @Override
public void destroy() {
} @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding(newCharset);
response.setContentType("text/plain;charset=" + newCharset); HttpServletRequest httpRequest = (HttpServletRequest) request;
CharsetServletRequestWrapper requestWrapper = new CharsetServletRequestWrapper(httpRequest, oldCharset, newCharset);
chain.doFilter(requestWrapper, response);
} }
Servlet & JSP - Filter的更多相关文章
- JSP中的Servlet及Filter
asp.net中,如果开发人员想自己处理http请求响应,可以利用HttpHandler来满足这一要求:类似的,如果要拦截所有http请求,可以使用HttpMoudle.java的web开发中,也有类 ...
- Servlet、Filter、Listener、Interceptor
首先,JSP/Servlet规范中定义了Servlet.Filter.Listener这三种角色,并没有定义Interceptor这个角 色,Interceptor是某些MVC框架中的角色,比如Str ...
- Servlet、Filter和Listener
Java Servlet是与平台无关的服务器端组件,运行于Servlet容器中(如Tomcat),Servlet容器负责Servlet和客户端的通信以及调用Servlet的方法,Servlet和客户端 ...
- 报错:严重: Servlet.service() for servlet [jsp] in context with path [/20161116-Struts2-6] threw exception [/index.jsp (line: 13, column: 20) No tag "textfiled" defined in tag library imported with prefix
严重: Servlet.service() for servlet [jsp] in context with path [/20161116-Struts2-6] threw exception [ ...
- javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册
一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...
- j2ee Servlet、Filter、Listener
首先,JSP/Servlet规范中定义了Servlet.Filter.Listener这三种角色,并没有定义Interceptor这个角色,Interceptor是某些MVC框架中的角色,比如Stru ...
- servlet&jsp高级:第三部分
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- JSP Filter,GZIP压缩响应流
url:http://hi.baidu.com/xhftx/blog/item/fbc11d3012648711ebc4af59.html 关键词:JSP,Filter,Servlet,GZIP 现在 ...
- Servlet、Filter 生命周期
Servlet作为JavaEE必须掌握的内容,Struts2通过使用Filter的功能实现了一个MVC的框架.因此掌握这Servlet以及Filter的生命周期显得非常重要. 1. Servlet的生 ...
随机推荐
- Android MuPDF 部署
MuPDF是一款轻量级的开源软件,可以用来阅读PDF文件.下载完源代码以后,想要运行成功,除了Android SDK之外,还需要Android NDK环境,因此有点麻烦. 但是一旦安装完必须的环境以后 ...
- NOSQL之旅---HBase
最近因为项目原因,研究了Cassandra,Hbase等几个NoSQL数据库,最终决定采用HBase.在这里,我就向大家分享一下自己对HBase的理解. 在说HBase之前,我想再唠叨几句.做互联网应 ...
- ios8,xcode6 周边
NSBundle.mainBundle().infoDictionary iOS 8中带按钮的推送代码 ") ){ application.registerForRemoteNotifica ...
- flex 简单跑马灯效果(竖着显示)
<mx:Move id="move_area" target="{VBox_AreaWarning}"/> //move效果,模拟跑马灯 <s ...
- 学习JSONP
最近自己研究 跨域调用js,然后 发现 有jsonp 这种技术,在Jquery中可以使用,于是 研究下原理 发现: 其实 就是 利用<script>的跨域访问的能力. 调用 服务端 返回的 ...
- GLSL实现Ambient Occlusion 【转】
http://blog.csdn.net/a3070173/archive/2008/11/04/3221181.aspx 相信使用OpenGl或DirectX3D的朋友都知道到固定功能管线在光照处理 ...
- iOS开发——语法篇OC篇&高级语法精讲二
Objective高级语法精讲二 Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和 ...
- 解决PowerDesigner 反向工程没有注释(备注)
本文转载自:http://www.cnblogs.com/zhangxb/archive/2012/04/20/2458898.html 1. 列注释 原来代码: {OWNER, TABLE, S, ...
- xtrabackup原理2
XTRABACKUP备份原理实现细节——对淘宝数据库内核月报补充 前言 淘宝3月的数据库内核月报对xtrabackup的备份原理做了深入的分析,写的还是很不错.不过Inside君在看完之后,感觉没有对 ...
- C++中创建对象的时候加括号和不加括号的区别
c++创建对象的语法有----- 1 在栈上创建 MyClass a; 2 在堆上创建加括号 MyClass *a= new MyClass(); 3 不加括号 MyClass *a = new My ...