5.过滤器
一、编写过滤的步骤
1、编写一个类,实现javax.servlet.Filter接口,这样的类一般称之为过滤器类
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("FilterDemo1拦截了");
chain.doFilter(request, response);//放行
}
2、在web.xml中进行配置,要拦截哪些资源。
<filter>
<filter-name>FilterDemo1</filter-name>
<filter-class>cn.itcast.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
二、过滤器的执行过程
多个过滤器的拦截顺序是按照web.xml中filter-mapping元素的出现顺序进行拦截的。 过滤器只会被初始化一次,应用被加载时就完成了初始化。
三、
- 全部过滤 /*
- 过滤以do结尾 *.do
- 过滤资源文件 .css,.js,.html,.jsp等
四、案例
1.设置编码
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
request.setCharacterEncoding(encoding);
response.setContentType("text/html;charset=UTF-8");
System.out.println("Filter前");
chain.doFilter(request, response);//放行
System.out.println("Filter后");
}
2.设置静态资源缓存时间
@WebFilter(filterName="NeedCacheFilter", urlPatterns = {"*.html","*.js","*.css"},
initParams = {
@WebInitParam(name = "html", value = "1"),// value是缓存的时间
@WebInitParam(name = "css", value = "1"),
@WebInitParam(name = "js", value = "1")
}
)
public class NeedCacheFilter implements Filter {
private FilterConfig filterConfig;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
// 获取html、css、js各自的缓存时间,如果没有,给个默认值是1小时
String value = null;
String uri = request.getRequestURI();// /day19/index.html
String extendName = uri.substring(uri.lastIndexOf(".") + 1);
if ("html".equals(extendName)) {// 访问的html资源
value = filterConfig.getInitParameter("html");
} else if ("css".equals(extendName)) {// 访问的css资源
value = filterConfig.getInitParameter("css");
} else if ("js".equals(extendName)) {// 访问的js资源
value = filterConfig.getInitParameter("js");
}
if (value != null) {
int time = Integer.parseInt(value);
response.setDateHeader("Expires", System.currentTimeMillis() + time * 60 * 60 * 1000);
}
System.out.println(111);
chain.doFilter(request, response);
System.out.println(222);
}
@Override
public void init(FilterConfig config) throws ServletException {
this.filterConfig = config;
}
}
3.控制动态资源(Servlet JSP)不要缓存的过滤器
@WebFilter(filterName="NoCacheFilter", urlPatterns = {"/servlet/*","*.jsp"})
public class NoCacheFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
response.setHeader("Expires", "-1");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
}
}
4.(敏感词)脏话过滤器
5.全站默认全部压缩
6.HTML特殊符号过滤器
五、过滤器的高级配置
filter默认只过滤REQUEST(请求)
<filter-mapping>
<filter-name>FilterDemo3</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher> 默认情况。如果写了另外一种情况,默认的就没有了
<dispatcher>FORWARD</dispatcher>-->过滤转发
<dispatcher>INCLUDE</dispatcher>-->过滤动态包含
<dispatcher>ERROR</dispatcher>-->过滤页面错误
</filter-mapping>
六、多个过滤器的执行顺序
- 在xml的配置文件中,有上至下的执行,
- 在注解中,按类名称(不是配置filter-那么,是class文件的名称)a-z的顺序。
文章信息
- 本文作者:zhangxue
- 本文链接:https://lucksnow1989.github.io/article/2.JavaEE/5.过滤器.html
- 版权声明:本文为本人原创文章,遵循 CC 4.0 BY-NC-SA版权协议,转载请附上原文出处链接和本声明。