过滤器
Filter:过滤器,是Java Web技术中的三大组件之一(还有Servlet和Listener)。其对应的接口为javax.servlet.Filter
Filter命名为过滤器,顾名思义,就跟我们生活中的自来水一样,自来水的源头可能会来源于不同的地方,但是我们要使用的话都是要经过过滤器进行一些处理,比如吸附杂质啦,去除异味啦。而在web中体现过滤器的处理操作的就是对“请求源”进行一些统一的处理,才能最终被服务端"接收"。
类比我们用水龙头接收自来水,服务器端就相当于接收的地方,而"水"的来源则来源于浏览器端,这些来源即是浏览器向服务器中发送的各种请求。如果我们使用了过滤器来拦截这些请求,那么就可以对这些请求做一些统一的操作,以简化Servlet类的某些程序的重复书写。
即:
web中的过滤器指的是当浏览器访问服务器资源时(发送请求),过滤器可以将请求拦截下来,进行一些统一处理,完成一些特殊功能,之后再放行。
主要用途:
-
设置统一编码,之前在学Servlet的时候,经常要在每个Servlet类中设置请求消息字符集和响应消息字符集,有了过滤器之后就可以统一设置了
-
进行一些逻辑判断,例如判断用户登录,是否有权限访问该页面,过滤敏感字符(例如游戏中常见的名称被*号和谐)等
使用方式:
-
创建一个类继承Filter(javax.servlet.Filter),实现其对应的方法,包括:init(), doFilter(),destory().
-
配置拦截路径,两种方式:
- 在web.xml中配置,其示例如下:
<!--filter web.xml配置-->
<filter>
<filter-name>demo1</filter-name>
<!-- 对应的实现Filter接口的类-->
<filter-class>smrobot.zhang.Filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<!--映射 名称要和上面的filter-name标签中的名称对应-->
<filter-name>demo1</filter-name>
<!--设置拦截路径,即是注解中的内容-->
<url-pattern>/*</url-pattern>
</filter-mapping>
- 使用注解方式配置:
直接在创建的Filter类中加上注解:
@WebFilter("/*") // /*表示所有访问都拦截
public class FilterDemo1 implements Filter {
}
-
书写doFilter()方法,实现相应功能:
使用IDEA直接创建出来的Filter实现类代码如下,其中注解里面的dispatcherTypes是拦截方式,后面会讲到:
package smrobot.zhang.Filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(value = "/*", dispatcherTypes = DispatcherType.REQUEST)
public class FilterDemo1 implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("FilterDemo1被执行");
//放行
chain.doFilter(req, resp);
System.out.println("FilterDemo1回来了");
}
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
}
说明:
-
init():方法是初始化过滤器对象,在服务器启动的时候就会被创建了
-
destory():方法是销毁过滤器对象,当服务器正常关闭时(就Tomcat而言使用自带的关闭程序或者在IDEA中点击关闭按钮都是正常关闭)被调用。
-
这两个方法用得不多,主要的还是doFilter()方法:当浏览器访问服务器资源的时,并且该资源访问路径在该过滤器配置的拦截路径中,就会调用该方法,程序执行该doFilter()方法的流程为:
请求访问资源时调用chain.doFilter(req, resp)之前的代码(如上代码),只有写上chain.doFilter(req, resp)该代码过滤器才会放行让请求通过,不然请求时无法通过该过滤器,以至于请求不到资源。请求完毕之后程序将返回该方法,并执行chain.doFilter(req, resp)之后的代码。
过滤器的配置细节:
一:拦截路径的配置:
-
写上具体拦截路径:/index.jsp 只有访问该资源该过滤器才会被执行
-
拦截目录: /user/* 访问/user资源目录下的所有资源该过滤器会被执行
-
后缀名拦截: *.jsp 拦截所有后缀名为.jsp的资源,注意没有反斜杆 “/”
-
拦截所有资源: /* 拦截所有资源
二: 拦截方式配置:所谓方式,指的是资源被访问的方式,比如我们常见的转发请求,直接访问等。因此过滤器对各种访问方式就会有对应的拦截方式,包括以下几种方式:
- 注解配置:
- 设置dispatcherTypes属性
- REQUEST:默认值。浏览器直接请求资源
- FORWARD:请求转发访问资源
- INCLUDE:包含访问资源
- ERROR:错误跳转资源,即跳转到错误页面时
- ASYNC:异步访问资源
- 示例:
- 设置dispatcherTypes属性
@WebFilter(value = "/*", dispatcherTypes = DispatcherType.REQUEST)
public class FilterDemo1 implements Filter {
···
}
- web.xml配置
- 设置dispatcher标签即可
<!--filter web.xml配置-->
<filter>
<filter-name>demo1</filter-name>
<filter-class>smrobot.zhang.Filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<!--设置拦截路径,即是注解中的内容-->
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
过滤器链:即可以对一个资源路径设置多个过滤器,在请求资源时会逐个通过多个过滤器,多个过滤器即构成过滤器链。
而资源在通过这些过滤器时是有一个先后顺序的,访问的先后顺序是根据我们配置过滤器的拦截路径不同而不同的。
- 注解配置:根据Filter实现类的类名的字符串比较来运行的,小的先执行,大的后执行。
- web.xml配置:哪个定义在上边,谁就先执行。
监听器
Listener: 监听器,也是web的三大组件之一,不过用的好像相对较少,基本不会使用到
监听器相关:
事件监听机制:
- 事件 :一个操作,事件,例如鼠标滑动,键盘点击,当然在java中不是指这些
- 事件源 :事件发生的地方,比如对应组件
- 监听器 :一个对象,在java中即实现对应的类,跟Servlet和Filter类似,实现监听代码
- 注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码
主要监听器:
ServletContextListener:
监听ServletContext对象的创建与销毁,因此在服务器启动和关闭之前就会调用。
使用方式:
-
创建类继承ServletContextListener接口
-
复写对应的方法:
@WebListener public class ListenerDemo1 implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { //ServletContext对象创建时调用 } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { //ServletContext对象销毁时调用 } }
配置方式:
-
注解配置:
直接加上 @WebListener 即可
-
web.xml配置:
> <listener>
> <listener-class>Listener类名</listener-class>
>
> </listener>
>
> <context-param>
>
> <!-- 配置context-param参数,下面参数视需求而定 -->
>
> <param-name>transformWsdlLocations</param-name>
> <param-value>false</param-value>
> </context-param>
其他监听器:
HttpSessionListener:监听Session的创建于销毁
HttpSessionAttributeListener: 监听Session的属性的添加,删除和替换