1.Filter过滤器的用途
web中的过滤器:当有请求访问服务器的时候,过滤器可以将请求拦截下来,完成一些特殊的操作(修改请求和响应的参数、放行请求、重定向请求等)。
作用:一般用于完成通用的操作
实例:登录验证、统一编码处理、敏感字符过滤
2.过滤器的实现
- 定义一个类实现Filter接口
- 复写其方法()
- 配置拦截路径
public class MyFilter implements Filter {
@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("===过滤器初始化===");
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
System.out.println("===过滤器执行===");
//放行请求
chain.doFilter(req, resp);
System.out.println("===放行之后会执行响应...===");
}
@Override
public void destroy() {
System.out.println("===过滤器销毁===");
}
}
3.过滤器配置详解
拦截路径配置:
-
具体资源路径:/index.jsp 只有访问index.jsp资源时,过滤器才会被执行。
-
拦截目录:/user/* 访问/user下的所有资源时,过滤器都会被执行
-
后缀名拦截:/*.jsp 访问jsp后缀的资源是,过滤器都会被执行。
-
拦截所有资源:/* 访问所有资源时,过滤器都会被执行
拦截方式配置:
资源被访问的方式
注解配置:
设置dispatcherTypes属性:
REQUEST:默认值,浏览器直接请求资源
FOWORD :转发访问资源
INCLUDE:包含访问资源
error:错误跳转资源
async:异步访问资源
@webFilter(value="/*",dispatcherTypes = DispatcherType.REQUEST) 两种访问方式@webFilter(value="/*",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.Forward})
多个过滤器(过滤器链)
多个过滤器的执行顺序:(注意:请求和响应是相反的)
请求时是:A --> B --> C
响应时是:C --> B --> A
4.登录过滤器
mport javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebFilter("/*")
public class LoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
HttpSession session = request.getSession();
//请求路径
String path = request.getRequestURI();
System.out.println(path);
//获取session中作为判断的关键字
String pwd = (String) session.getAttribute("passwd");
//判断是否包含登录页面的请求,则放行
if(path.indexOf("/userServlet/login")>-1){
chain.doFilter(request, response);
}else{//如果没有则,判断是否有session中的标志,没有则不让访问页面,让他去登录,反之放行
if(pwd==null||"".equals(pwd)){
response.sendRedirect("/login.jsp");
}else{
chain.doFilter(request, response);
}
}
}
public void init(FilterConfig config) throws ServletException {
}
}
5.字符编码过滤器
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;
@WebFilter(filterName = "EncodingFilter",
urlPatterns = "/encodingTest",
initParams = {
@WebInitParam(name = "charset", value = "utf-8")
})
public class EncodingFilter implements Filter {
private String filterName;
private String charset;
public void destroy() {
// 销毁时调用
System.out.println(filterName + "销毁");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
/*过滤方法 主要是对request和response进行一些处理,然后交给下一个过滤器或Servlet处理*/
System.out.println(filterName + "doFilter()");
req.setCharacterEncoding(charset);
resp.setCharacterEncoding(charset);
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
/*初始化方法 接收一个FilterConfig类型的参数 该参数是对Filter的一些配置*/
filterName = config.getFilterName();
charset = config.getInitParameter("charset");
System.out.println("过滤器名称:" + filterName);
System.out.println("字符集编码:" + charset);
}
}