1、什么是过滤器?
Filter也称之为过滤器。Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、设置统一编码格式等一些高级功能。
2、Filter的工作原理
- 客户端发起请求
- web容器(tomcat)接受到请求后会到web.xml中查找是否有配置过滤器。如果有则进入过滤器
- 执行过滤器的doFilter方法。
- 执行过滤器前半段请求处理。
- 执行FilterChain.doFilter()放行
- 执行过滤器的后半段响应处理
3、Filter 怎么写?
实现Filter接口,该接口有三个方法,分别为:
- init(FilterConfig) 初始化
- doFilter()过滤处理方法
- destory()销毁方法
- 写Filter 类
/**
* 登录过滤器
*/
public class LoginFilter implements Filter {
//不过滤的请求
private String [] excludeUrl;
//过滤的请求
private String[] filterUrl;
//跳转的页面
private String redirectUrl;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
excludeUrl=filterConfig.getInitParameter("excludeUrl").split(";");
// filterUrl=filterConfig.getInitParameter("filterUrl").split(";");
redirectUrl=filterConfig.getInitParameter("redirectUrl");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest) servletRequest;
HttpServletResponse response=(HttpServletResponse) servletResponse;
User user=(User) request.getSession().getAttribute("user");
String uri=request.getRequestURI();
System.out.println("uri="+uri);
//如果用户存在,则放行
if(user!=null||StringUtils.contains(uri,excludeUrl)){
filterChain.doFilter(request,servletResponse);
}else{
//跳转页面
response.sendRedirect(request.getContextPath()+redirectUrl);
}
}
@Override
public void destroy() {
System.out.println("登录过滤器销毁");
}
2)在web.xml中配置Filter
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<filter>
<filter-name>encodeFilter</filter-name>
<filter-class>filter.EncodeFilter</filter-class>
<init-param>
<param-name>encode</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>filter.LoginFilter</filter-class>
<init-param>
<param-name>excludeUrl</param-name>
<param-value>/login.jsp;/index.jsp;/login</param-value>
</init-param>
<init-param>
<param-name>redirectUrl</param-name>
<param-value>/index.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.do</url-pattern>
</filter-mapping>
</web-app>
Filter应用
- 登录验证
- 过滤敏感词汇
- 编码格式统一设置
@WebFilter(filterName = "FImgCacheilter",value = {".jpg",".png",".bmp",".html",".css",".js"})
public class FImgCacheilter 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;
//将浏览器缓存设置为10分钟
response.setDateHeader("Expires",System.currentTimeMillis()+600000);
//cache-control :
// max-age>0 时 直接从游览器缓存中 提取
// max-age<=0 时 向server 发送http 请求确认 ,该资源是否有修改
//有的话 返回200 ,无的话 返回304。
//
//通俗解释:
// 响应头中的Cache-Control:max-age=600是通知浏览器:600秒之内不要烦我,自己从缓冲区中刷新。
response.setHeader("Cache-control","max-age=600");
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}