摘要:
可认为是Servlet的“加强版”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。
Filter也可以对用户请求响应,这一点与Servlet相同,但实际上很少会使用Filter向用户请求生成响应。
使用Filter完整流程:
Filter对用户请求进行预处理,接着请求给Servlet进行处理并生成响应,最后Filter再对服务器进行后处理
Filter有如下几个用处:
- 在HttpServletRequest到达Servlet之前,拦截用户的HttpServletRequest
- 根据需要要检查HttpServletRequest也可以修改HttpServletRequest头和数据
- 在HttpServletResponse到达客户端之前,拦截HttpServletResponse
- 根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据
Filter有如下几个种类:
- 用户授权的Filter:Filter负责检查用户请求,根据请求过滤用户的非法请求
- 日志Filter:详细记录某些特殊的用户请求
- 负责解码的Filter:包裹对非标准码的请求解码
- 能改变xml内容的XSLT Filter
- Filter可负责拦截多个请求或相应:一个请求或响应也可以被多个Filter拦截
创建一个Filter只需要两个步骤
1:创建Filter处理类
2:web.xml文件中配置Filter
程序演示:
1 package com.huayu.filter;
2 import java.io.IOException;
3
4 import javax.servlet.Filter;
5 import javax.servlet.FilterChain;
6 import javax.servlet.FilterConfig;
7 import javax.servlet.ServletContext;
8 import javax.servlet.ServletException;
9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.http.HttpServletRequest;
12
13
14 public class Filter001 implements Filter{
15 private FilterConfig config;
16 @Override
17 public void init(FilterConfig arg0) throws ServletException {
18 arg0=config;
19 }
20
21
22
23
24 @Override
25 public void doFilter(ServletRequest req, ServletResponse res,
26 FilterChain filterchain) throws IOException, ServletException {
27 //预处理
28 ServletContext context=this.config.getServletContext();
29 long before=System.currentTimeMillis();
30 System.out.println("开始过滤");
31 //将请求转换成httpServletRequest请求
32 HttpServletRequest htsre=(HttpServletRequest) req;
33 System.out.println("Filter已经截获到的请求地址:"+htsre.getServletPath());
34 //过滤器只是链式处理,请求依旧放到目标地址
35 filterchain.doFilter(req, res);
36
37 //---------对服务器响应后处理----------
38 long after=System.currentTimeMillis();
39 System.out.println("过滤结束");
40
41 System.out.println("请求被定为到"+htsre.getRequestURI()+"所花时间"+(after-before));
42
43 }
44
45 @Override
46 public void destroy() {
47
48
49 }
50
51 }
1 <?xml version="1.0" encoding="UTF-8"?>
2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
3 <display-name>FilterAndEl</display-name>
4 <welcome-file-list>
5 <welcome-file>index.html</welcome-file>
6 <welcome-file>index.htm</welcome-file>
7 <welcome-file>index.jsp</welcome-file>
8 <welcome-file>default.html</welcome-file>
9 <welcome-file>default.htm</welcome-file>
10 <welcome-file>default.jsp</welcome-file>
11 </welcome-file-list>
12 <filter>
13 <filter-name>log</filter-name>
14 <filter-class>com.huayu.filter.Filter001</filter-class>
15 </filter>
16 <filter-mapping>
17 <filter-name>log</filter-name>
18 <url-pattern>/*</url-pattern>
19 </filter-mapping>
20 </web-app>
总结:
创建Filter必须实现javax.servlet.Filter接口,重写三个方法
void init(FilterConfig config):用于完成Filter的初始化
void destroy():用于Filter销毁前,完成某些操作
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterchain) throws IOException, ServletException
该方法就是对没个请求及响应增加额外的处理
过滤器对用户的请求进行预处理和服务器的响应进行后处理的分解线
FilterChain.doFilter()
配置过滤器:
两种方式
1:在web.xml里面配置
2:用注解的方式(web3.0之后才可以使用)
下面通过注解的方式来配置过滤器并且通过使用过滤器来解决中文乱码问题
程序如下:
1 package com.huayu.filter;
2
3 import java.io.IOException;
4
5 import javax.servlet.Filter;
6 import javax.servlet.FilterChain;
7 import javax.servlet.FilterConfig;
8 import javax.servlet.ServletException;
9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.annotation.WebFilter;
12 import javax.servlet.annotation.WebInitParam;
13 import javax.servlet.http.HttpServletRequest;
14 import javax.servlet.http.HttpSession;
15 @WebFilter(urlPatterns={"/*"},
16 initParams={
17 @WebInitParam(name="encoding",value="GBK"),
18 @WebInitParam(name="loginpage",value="login.jsp"),
19 @WebInitParam(name="proLogin",value="loginSuccessful.jsp")
20 }
21
22 )
23 public class Filter002 implements Filter{
24 private FilterConfig config;
25 @Override
26 public void init(FilterConfig config) throws ServletException {
27 this.config=config;
28 }
29
30
31
32 @Override
33 public void doFilter(ServletRequest req, ServletResponse res,
34 FilterChain fc) throws IOException, ServletException {
35
36 String encoding=config.getInitParameter("encoding");
37 String loginpage=config.getInitParameter("loginpage");
38 String proLogin=config.getInitParameter("proLogin");
39 //处理乱码
40 req.setCharacterEncoding("GBK");
41 HttpServletRequest requ=(HttpServletRequest) req;
42 HttpSession session=requ.getSession();
43 String name=(String) session.getAttribute("name");
44
45 if(name!=null&&!("".equals(name))){
46 session.setAttribute("name", req.getParameter("username"));
47 fc.doFilter(req, res);
48
49 }else{
50 req.getRequestDispatcher(loginpage).forward(req, res);
51
52 }
53 }
54 @Override
55 public void destroy() {
56 // TODO Auto-generated method stub
57
58 }
59 }
累了,想想,生活中充满诗和远方,亦不乏仓央嘉措的妙音天女。