写在前面:
- 1、核心是真正的认知request和response。
- 2、完全自由的自定义response
- 3、Filter本身的功能和配置
Filter的特性使它可以处理特殊的工作,例如权限验证,日志记录,数据压缩,数据加密,格式转换,图像处理等。
1、防盗链Filter
这个生产就用到了,因为OS资源入侵,通过窜改文件下载路径,去下载其它文件。
这个实力就是静态资源图片的 应用,在引用的时候通过Filter校验request中url是不是本网站的。
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
String referer = request.getHeader("referer");
if (referer == null || !referer.contains(request.getServerName())) {
request.getRequestDispatcher("/error.gif").forward(request, response);
} else {
chain.doFilter(req, resp);
}
}
大体逻辑如上,我们可以在这里校验用户的下载路径等等操作,从而防止他们用相对路径切换到root核心文件资源。
web.xml配置通过通配符,拦截所有静态资源即可。
2、字符编码Filter
字符编码Filter是最常见的Filter之一,常用来解决Tomcat等服务器里request,response乱码的问题。
package com.wht.demo.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/**
* 解决乱码问题
*
* @author JDIT
*/
@WebFilter(filterName = "CharacterEncodingFilter")
public class CharacterEncodingFilter implements Filter {
private String characterEncoding;
public void init(FilterConfig config) throws ServletException {
characterEncoding = config.getInitParameter("characterEncoding");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
if (null != characterEncoding) {
req.setCharacterEncoding(characterEncoding);
resp.setCharacterEncoding(characterEncoding);
}
chain.doFilter(req, resp);
}
public void destroy() {
}
}
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.wht.demo.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>characterEncoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>