过滤器
简介
对Web应用来说,过滤器是一个驻留在服务器端的Web组件,它可以截取客户端和服务器之间的请求与响应信息,并对这些信息进行过滤。
当Web容器接受到一个对资源的请求时,它将判断是否有过滤器与这个资源相关联。如果有,那么容器将把请求交给过滤器进行处理。
在过滤器中,你可以改变请求的内容,或者重新设置请求的报头信息,然后再将请求发送给目标资源。当目标资源对请求作出响应时候,容器同样会将响应先转发给过滤器,在过滤器中你可以对响应的内容进行转换,然后再将响应发送到客户端。
常见的过滤器用途主要包括
对用户请求进行统一认证、对用户的访问请求进行记录和审核、对用户发送的数据进行过滤或替换、转换图象格式、对响应内容进行压缩以减少传输量、对请求或响应进行加解密处理、触发资源访问事件、对XML的输出应用XSLT等。
和过滤器相关的接口主要有
Filter、FilterConfig和FilterChain。
部署过滤器的方法
1.注解
@WebServlet(urlPatterns="/edit_emp.do", loadOnStartup=1)
坏处:无法确定过滤器的执行顺序
2.配置web.xml
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.kygo.filters.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
好处:可以确定过滤器的执行顺序,先写先执行
例子1:改变编码
// @WebFilter(urlPatterns={"*.do"})
public class CharacterEncodingFilter implements Filter {
public CharacterEncodingFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
// 在请求小服务之前要做的处理
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
// 过滤器链条 继续下一个过滤器
chain.doFilter(req, resp);
// 在请求小服务之后要做的处理
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
例子2:不让其他网站使用自己服务器上的图片资源
@WebFilter(urlPatterns={"*.jpg", "*.png", "*.gif"})
public class ImageProtectionFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
String referer = request.getHeader("Referer");
if (referer != null) {
chain.doFilter(req, resp);
}
else {
HttpServletResponse response = (HttpServletResponse) resp;
response.sendError(404);
}
}
}