> 前置内容:
>
> * [会话跟踪技术](https://www.cnblogs.com/dandelion-000-blog/p/16779628.html)

## 1、 Filter快速入门

* 使用步骤

1. 定义类并实现Filter接口
2. 定义@WebFilter注解,配置拦截路径
3. 放行
4. (请求其他资源)

 

* Demo

“`java
package priv.dandelion.controller.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(“/*”)
public class FilterDemo implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 放行前逻辑
System.out.println(“FilterDemo…”);

// 放行
filterChain.doFilter(servletRequest, servletResponse);

// 放行后逻辑
}

@Override
public void destroy() {

}
}

“`

 

## 2、 Filter执行流程

1. 浏览器发送请求到服务器
2. Filter拦截请求
3. 执行放行前逻辑
4. 放行请求
5. 访问对应资源
6. 执行放行后逻辑
7. 服务器对浏览器做出响应

 

## 3、 Filter使用细节

* 拦截路径配置

* 拦截具体资源:`/index.jsp`
* 目录拦截:`/user/*`
* 后缀名拦截:`*.jsp`
* 拦截所有:`/*`

* 过滤器链

* 一个Web应用可以配置多个过滤器,多个过滤器成为过滤器链

* 多个过滤器逐一放行
* 请求资源
* 按照递归顺序执行过滤器链的放行后逻辑

* 过滤器链的过滤顺序

* 若使用注解配置过滤器,则按照全类名进行排序,即为过滤器链的执行顺序
* 可在XML中配置顺序

## 4、 案例

* 需求

* 访问服务器资源时,需要先进行登录验证,如果没有登录则自动跳转到登录页面

* 方式

* 判断请求资源是否和登录注册相关,若是则放行
* 判断Session中是否有User对象,若有则放行,否则跳转到登录

* 环境准备

> 环境和案例框架见:[用户登录注册案例](https://www.cnblogs.com/dandelion-000-blog/p/16779628.html#4-%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E6%B3%A8%E5%86%8C%E6%A1%88%E4%BE%8B)

* 代码实现

“`java
package priv.dandelion.controller.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@WebFilter(“/*”)
public class LoginFilter implements Filter {

@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

HttpServletRequest req = (HttpServletRequest) servletRequest;

// 判断访问的资源是否和登录注册相关
String[] urls = {“/login.jsp”, “/register.jsp”, “/imgs/”, “/css/”, “/login”, “/register”, “/checkCode”};
// 获取当前访问资源的路径
String requestURL = req.getRequestURL().toString();

for (String url : urls) {
if (requestURL.contains(url)) {
// 若为和登录注册相关的资源,则放行并直接结束过滤器执行
System.out.println(url);
filterChain.doFilter(req, servletResponse);
return;
}
}

// 判断Session中是否有user
// 获取Session
Object user = req.getSession().getAttribute(“user”);

if (user != null) {
// 放行
System.out.println(“已登录,放行”+ user);
filterChain.doFilter(servletRequest, servletResponse);
} else {
// 存储提示信息,拦截跳转到登录页面
System.out.println(“未登录,将跳转到登录页面”);
req.setAttribute(“login_msg”, “您尚未登录!”);
req.getRequestDispatcher(“/login.jsp”).forward(req, servletResponse);
}

}

@Override
public void destroy() {

}
}
“`

 

原文地址:http://www.cnblogs.com/dandelion-000-blog/p/16813114.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性