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的生 ...
随机推荐
- angular 管理后台
http://blog.csdn.net/iamnieo/article/details/50474399
- Spring REST实践之HATEOAS
HATEOAS HATEOAS(The Hypermedia As The Engine Of Application Statue)是REST架构的主要约束."hepermedia&quo ...
- TypeScript学习笔记(七):模块
JavaScript中的模块 在学习TypeScript的模块之前我们先看看在JavaScript中的模块是如何实现的. 模块的好处 首先我们要了解使用模块的好处都有什么? 模块化.可重用: 封装变量 ...
- C#学习笔记(十一):动态类型
C#是一门静态类型的语言,但是在C#4.0时微软引入了动态类型的概念. dynamic 关键字dynamic用来定义动态对象,我们来看一下动态类型的一些特性. 调用不同类的相同方法 我们有两个或多个不 ...
- SQLserver锁和事务隔离级别的比较与使用(转)
SQLserver锁和事务隔离级别的比较与使用(转) http://www.cnblogs.com/chenlulouis/archive/2010/12/06/1898014.html http:/ ...
- Check Box 用法
void CMyDlg::OnInitDialog() //Check1 初始化为选中状态 void CMyDlg::OnInitDialog() { CDialog::OnInitDialog(); ...
- android中broadcastreceiver的用法-manifest中注册。
package com.jinhoward.broadcast.activity; import com.jinhoward.broadcast.activity.R; import android. ...
- PROCESS_YIELD()宏和C语言的switch语句< contiki学习笔记之七>
写在前面: 按照main()函数的代码一行一行的分析,该是看到了 etimer_process 这个位置.但是etimer_process实现里的一个宏 PROCESS_YIELD()引出了很多故事 ...
- Hibernate中的session对象update方法的使用
使一个游离对象转变为持久化对象.例如以下代码在session1中保存了一个Customer对象,然后在session2中更新这个Customer对象: Customer customer = new ...
- Covarience And ContraVariance
using System; using System.Collections.Generic; using System.IO; namespace CovarientAndContraVarient ...