1:了解Servlet过滤器的概念
1)Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用。
2)Servlet过滤器能够在Servlet被调用之前检查Request对象,修改Request Header和Request内容;
3)在Servlet被调用之后检查Response对象,修改Response Header和Response内容。Servlet过滤器负责过滤的Web组件可以是Servlet、JSP或HTML文件。
4)过滤器是请求和响应之间的一种WEB组件,它驻留在服务器端,用来截取客户端与资源之间的请求,并对这些信息进行“过滤”。
2:了解Servlet过滤器的工作过程
所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法:
–init()
–doFilter()
–destroy()
1)init(FilterConfig config):这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml 文件中Servlet过滤器的初始化参数
2)doFilter(ServletRequest request, ServletResponse response,FilterChain chain):
这个方法完成实际的过滤操作。当客户请求访问与过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器
3)destroy():Servlet容器在销毁过滤器实例前调用该方法,在这个方法中可以释放Servlet过滤器占用的资源
3:掌握创建发布Servlet过滤器的方法
1)创建Servlet过滤器类NoteFilter.java
2)配置Servlet的Web.xml(必须要配置在Servlet节点前才能起到过滤效果)
3)创建Servlet要过滤的内容(servlet/jsp/html)
4:过滤器的应用:
1)使浏览器不缓存页面的过滤器:
有 3 个 HTTP 响应头字段都可以禁止浏览器缓存当前页面,它们在 Servlet 中的示例代码如下:
//设定网页的到期时间,一旦过期则必须到服务器上重新调用
response.setDateHeader("Expires",-1);
//Cache-Control指定请求和响应遵循的缓存机制 no-cache指示请求或响应消息不能缓存
response.setHeader("Cache-Control","no-cache");
//是用于设定禁止浏览器从本地机的缓存中调阅页面内容,设定后一旦离开网页就无法从Cache中再调出 。
response.setHeader("Pragma","no-cache");
并不是所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面的三个响应头
2)设置字符编码,以解决中文乱码问题。
对于设置请求编码,应该先判断是否已设置编码,然后在设置编码。
If(request.getCharaterEncoding() == null){
Request.setCharaterEncoding(“utf-8”);
}
因为响应编码的默认是iso-8859-1,所以应强制设置编码。
response.setContentType(“text/html;charset=utf-8”);
response.setCharaterEncoding(“utf-8”);
编码参数可以放到配置文件中来增强程序的扩张性。
3)用户权限控制:编写一个用于检测用户是否登陆的过滤器,如果用户未登录,则重定向到指定的登录页面(主要是检测session中是否包含登录设置的属性)。
由于在权限控制中,可以设置过滤器对所有的请求过滤,对于登录页面这类不需要进行过滤的页面可以以配置参数的形式传递到过滤器中,来解决对所有请求过滤而无法登录的问题。
4)对敏感词汇,html,请求参数两边的空格进行过滤(使用装饰模式)
Servlet API 中提供了一个 HttpServletRequestWrapper 类来包装原始的 request 对象, HttpServletRequestWrapper 类实现了 HttpServletRequest 接口中的所有方法,这些方法的内部实现都是仅仅调用了一下所包装的的 request 对象的对应方法
相类似 Servlet API 也提供了一个 HttpServletResponseWrapper 类来包装原始的 response 对象。
public class MyHttpRequest extends HttpServletRequestWrapper {
public MyHttpRequest(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String arg0) {
String value=this.getRequest().getParameter(arg0);
value=value.replaceAll("不雅文字", "XXX");
return value;
}
}