一. 过滤器
1. 定义: 过滤器是指定义在服务器端的一段程序, 可以截获客户端发来的请求, 并根据一定规则进行过滤和拦截.
2. 过滤器的生命周期:
1. 服务器启动: 先通过 web.xml 加载过滤器进行实例化 (这个过程是调用过滤器中 init() 方法, 同样也是只执行一次);
2. 客户端发送请求: 执行过滤器中的 doFilter()方法, 这个方法会执行 N 次, 每次有请求发送过来, 都会执行这个方法进行过滤;
3. 销毁过程: 同 servlet, 关闭或者停止服务器的时候会执行 destroy()方法;
3. 过滤器链:
不同的请求互不影响, 过滤器链主要是针对多个过滤器过滤同一个 url 请求, 过滤器的先后顺序是按照在 web.xml 的配置顺序来的;
运行顺序: 请求 --->过滤器 1 过滤 --->过滤器 2 过滤 --->后台处理层 --->过滤器 2 过滤 --->过滤器 1 过滤 --->客户端接收
4. 在 web.xml 中配置过滤器:
- <filter>
- <filter-name>Myfilter</filter-name>
- <filter-class>com.hanqi.filter.Myfilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>Myfilter</filter-name>
- <url-pattern>/Testfilter</url-pattern><!-- 指哪些请求可以被过滤 -->
- </filter-mapping>
5. 过滤器应用示例: 检测当前用户是否有效.
- package com.hanqi.filter;
- 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 javax.servlet.http.HttpServletResponse;
- @WebFilter(value = "/*", initParams = { @WebInitParam(name = "page", value = "Login,Register,index,.js") })
- public class SessionFilter implements Filter {
- private String[] page;
- // 构造方法
- public SessionFilter() {
- }
- // 销毁方法, 以便释放资源
- public void destroy() {
- }
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
- throws IOException, ServletException {
- HttpServletRequest request1 = (HttpServletRequest) request;//HttpServletRequest 是 ServletRequest 的子类, 可以强转获得 request
- HttpServletResponse response1 = (HttpServletResponse) response;
- String url = request1.getRequestURI();// 获取请求路径
- if (checkUrl(url)) {
- chain.doFilter(request1, response1);// 对请求进行放行
- } else {
- Object o = request1.getSession().getAttribute("currentUser");
- if (o == null) {
- request.setAttribute("errmsg", "用户名已失效!");
- request.getRequestDispatcher("/WEB-INF/page/login.jsp").forward(request, response);
- } else {
- chain.doFilter(request1, response1);
- }
- }
- }
- // 过滤器初始化时会调用该方法
- public void init(FilterConfig fConfig) throws ServletException {
- String pages = fConfig.getInitParameter("page");// 获取初始化参数值
- this.page = pages.split(",");
- System.out.println(pages);
- }
- public boolean checkUrl(String url) {
- for (String p : page) {
- if (url.contains(p)) {
- return true;
- }
- }
- return false;
- }
- }
6. 关于注解:
在新版本 (从 Web2.5 开始) 中可以使用注解代替在 web.xml 中配置对象.
格式:@注解 ("属性值"), 其等同于 @注解(属性 ="属性值") 例:@WebFilter("/*")或 @WebFilter(value="/*")
带参数的格式:@WebFilter(filterName="Myfilter",value="/*",initParams= {@WebInitParam(name="",value="")})
注意: value 和 urlPatterns 都可以用来声明过滤的请求, 也同样都可以使用数组的形式定义, 但是这两个属性不能同时使用, 否则会报 java.lang.IllegalArgumentException 异常而无法启动 Tomcat 服务器;
来源: http://www.bubuko.com/infodetail-2648864.html