过滤器的原理:
过滤器:对指定的资源访问进行过滤和传播,过滤掉权限限制的请求,传播被过滤资源的共性功能。
原理图:
过滤器的编程步骤:
1.创建一个普通类,该类实现Filter接口,并实现所有的方法
2.在web.xml中配置过滤器
<filter>
<filter-name>过滤器名称</filter-name>
<filter-class>过滤器的全限定类名<filter-class>
</filter>
<filter-mapping>
<filter-name>过滤器名称</filter-name>
<url-pattern>需要过滤资源的路径</url-pattern>
</filter-mapping>
3.书写过滤器中的doFilter方法,实现功能代码
注:
1.只要启动服务器就会创建Filter对象,并执行init初始化方法
2.<url-pattern></url-pattern>中的配制方法:
(1)/* :表示本项目中的所有资源都要经过该过滤器
(2)*.jsp:表示本项目中所有的jsp文件都要经过该过滤器
(3)/admin/*:表示admin文件夹下的所有文件执行都要经过该过滤器
(4)/addServlet或者/add.jsp表示明确指定资源进行过滤
3.过滤器在xml文件中配置是放置在Servlet前面
4.多个过滤器过滤同一个资源的时候,会按照xml中过滤器放置的前后顺序依次过滤,其中任何一个过滤器不放行,目标资源就不能执行。
过滤器之全站乱码解决
请求的乱码解决问题:
在请求中,如果存在中文,在获取的时候就容易引起乱码情况,而在每个方法中书写乱码解决代码,效率低,代码的复用性差。
因此可以考虑从获取参数的方法中加入乱码解决代码,这样就不用每次在Servlet中书写乱码解决代码,提高了代码的复用性,效率也得到提高。
借鉴包装流的装饰者模式,可以同样用于解决乱码问题,具体步骤如下:
1.自定义一个类EncodingRequest,此类继承了HttpServletRequestWrapper
2.提供一个构造方法,用于接收Filter创建的request对象和编码方式,在类中定义两个成员变量request、charset用于存储这两个参数
HttpServletRequest request ;
String charset;
public EncodingRequest(HttpRequestServler request ,String charset)
{
super(request);
this.request = request ;
this.charset =charset ;
}
3.重写获取参数的三个方法getParameter、getParameterValues以及getParameterMap,在这些方法中书写解决乱码问题
过滤器之访问权限:
访问权限问题常见的是管理员和普通会员的操作的内容不同,不能出现越界操作。
访问权限的解决:
1、 将具有不同访问权限的资源放置到不同的文件目录下
2、 编写不同的过滤器,在web.xml过滤器的配置中,指定需要进行过滤的不同文件目录
3、 在过滤器的doFilter中书写业务代码
监听器:
监听器的分类:对对象的创建和销毁进行监听、对对象中的属性变更进行监听
对对象的创建和销毁进行监听:
ServletContextListener:监听ServletContext对象的创建和销毁
HttpSessionListener:监听HttpSession对象的创建和销毁
ServletRequestListener:监听ServletRequest对象的创建和销毁
对域对象的属性增删改进行监听:
ServletContextAttributeListener:监听ServletContext域对象中的属性
HttpSessionAttributeListener:监听HttpSession域对象中的属性
ServletRequestAttributeListener:监听ServletRequest域对象中的属性
编程步骤:
1.选择要监听的动作,创建一个普通类,使这个类实现监听器接口
2.配置web.xml文件(配置的位置在过滤器之前)
<listener>
<listener-class>监听器的全限定类名</listener-class>
</listener>
3.监听器中重写相应的方法