学习笔记——JavaWeb过滤器
1.什么是过滤器
过滤器是一个服务器端组件,它可以截取用户端的请求与相应信息,并对这些信息过滤。
简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。
2.过滤器的工作原理和生命周期
2.1工作原理
根据过滤器在Web.xml中的设置,特定的网址会经过特定的过滤器。随后通过过滤器的处理,再将处理过的用户请求发送至web资源,资源响应之后再发送到过滤器,过滤器再处理之后,才发送给用户。
2.2 生命周期
过滤器在Tomcat服务器启动时加载,通过Web.xml中的设置实例化,之后通过Filter.init()方法初始化。在触发过滤要求时,调用Filter.doFilter()执行过滤处理。最后在Tomcat服务器关闭时,调用Filter.destroy()销毁过滤器。
2.3 过滤器链
当一个请求符合多个过滤器的要求是,就会形成过滤器链。服务器会按在web.xml中过滤器定义的顺序将过滤器组装成一条链,用户请求通过这条链访问web资源。
具体处理过程:
多个过滤器的情况下,会先执行第一个过滤器chain.doFilter()前的代码,然后doFilter()到达第二个过滤器。第二个过滤器也会先执行chain.doFilter()前的代码,然后doFilter()到达Servlet.service()方法。之后在返回过滤器2doFilter()之后的代码,在返回过滤器1doFilter()之后的代码,最后才返回用户。
3.如何编写一个简单过滤器
3.1过滤器的三个主要方法
编写过滤器之前,先熟悉一下过滤器的三个主要方法:
3.2 继承 javax.servlet.Filter
开始编写第一步:继承
public class MyFirstFilter implements javax.servlet.Filter
3.3 重写doFilter
第二步:重写public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, IOException {
//你的代码
chain.doFilter(req, resp);
}
3.4 注册Filter
第三步:注册
4.过滤器的分类
过滤器根据其处理的请求类别,分为5类。Servlet2.5中定义了request,Forward,Include,Error四类,而Servlet3.0中定义了第5类:Async。下图中的RequestDispatcher的forward方法等于<jsp:forward>方法,同理,include等于<jsp:include>方法。第5类,Async用于通过过滤器访问的Servlet有大量耗时操作时,可直接回到过滤器chain.doFilter()之后的代码运行,让Servlet异步运行计算操作。
5.过滤器的应用
1.登录验证
1.1将过滤器的url地址设为“/*”
<filter-mapping>
<filter-name>MyFirstFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
1.2查看session中是否有登录名
public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
HttpSession session = request.getSession();
String username = (String) session.getAttribute("username");
if ("".equals(username) || username == null) {
response.sendRedirect("login.jsp");
}
chain.doFilter(req, resp);
}
2.编码 转换
在过滤其中添加以下语句:
request.setCharacterEncoding("UTF-8");
6.过滤器的其他问题
1.过滤器能否改变用户请求的资源,即改变用户请求的路径?
答:可以的。过滤器可通过,request.sendRedirect()方法或response.getDispatcher().forword()方法改变用户请求的路径。
2.过滤器能否直接诶返回数据?
答:不能。