高手速成 | 过滤器、监听器的创建与配置

举报
TiAmoZhang 发表于 2023/12/28 09:40:37 2023/12/28
【摘要】 本节讲解过滤器、监听器的创建以及监听事件配置示例。

 本节讲解过滤器、监听器的创建以及监听事件配置示例。

01、过滤器的创建与配置
【例1】创建过滤器及配置过滤规则。

(1) 在Eclipse中新建一个Web项目,取名为Chapt_09。在src目录下,新建一个名为com.test.filter的包。选中该包并按Ctrl+N组合键,在弹出的菜单中选择Web→Filter。选择创建过滤器,如图1所示,单击Next按钮。

■ 图1 选择创建过滤器

(2) 为创建的过滤器命名,如图2所示。在弹出的Create Filter对话框的Class name的文本框内输入TestFilter后,单击Next按钮。

■ 图2 为创建的过滤器命名

(3) 为过滤器添加过滤规则,如图3所示。在Filter mapping设置部分,单击Add按钮,在弹出的对话框中选中URL pattern单选框,并在Pattern下的文本框中填写/TestServlet,单击OK按钮,返回到Create Filter选项卡中并单击Finish按钮,即完成了对过滤器的设置。

 (4) 根据以上配置,TestFilter.java源文件自动生成的代码如下:

package com. test. filter;
import java. io. IOException;
import javax. servlet. Filter;
import javax. servlet. FilterChain;
import javax. servlet. FilterConfig;
import javax. servlet. ServletException;
import javax. servlet. ServletRequest;
import javax. servlet. ServletResponse;
import javax. servlet. annotation. WebFilter;
@WebFilter( {" /TestServlet" J)
public class TestFilter implements Filter {
public TestFilter() {
]
public void destroy() {
}
public void doFilter (ServletRequest request,
ServletResponse response, FilterChain chain) throws
chain. doFilter (request, response);
public void init(FilterConfig fConfig) throws ServletExcept{
             }
}

以上操作步骤是对一个过滤器的创建和过滤规则的配置,即TestFilter过滤器对访问路径为/TestServlet的访问资源进行过滤。

(5) 在TestFilter类中的各方法中填写代码如下:

public TestFilter() {
System.out.print 1n("过滤器构造器两数运行");
public void destroy() {
System.out.print 1n("过滤器消亡两数运行");
 
public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain)
throws I0Exception, ServletException {
System,out. printin(“对请求进行过滤处理”);
chain, doFilter (request, response);
System.out. println(”执行 chain. dorilter 方法后面的代码”);
}
public void init( FilterConf ig fConf ig ) throws ServletExcept ion {
System. out. print 1n("过滤器初始化两数运行”);

 (6) 在src目录下新建一个名为com.test.servlet的包,在该包下新建一个名为TestServlet的Servlet,匹配URL为/TestServlet,然后编写代码如下:

@WebServlet (" /TestServlet")
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public TestServlet () {
System. out.print1n("servlet 构造两数运行”);
)
protected void doGet (HttpServletRequest request, HttpServletResponse response)
throws ServletExcept ion, IOException {
Systen. out. Drint In( "servlet 请求处理”);
 
protected void doPost (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet (request, response);
}

(7) 验证当访问/TestServlet时,过滤器TestFilter是否对其进行过滤。

首先启动Tomcat,运行项目Chapt_09,在浏览器中输入http://localhost:8080/Chapt_09。Tomcat服务器启动后的后台输出显示如图4所示。此时控制台输出了过滤器构造函数与初始函数中的输出语句,说明当Web容器启动时,先初始化过滤器TestFilter。

■ 图4 Tomcat服务器启动后的后台输出显示

其次,再访问TestServlet,在浏览器中输入http://localhost:8080/Chapt_09/TestServlet,此时匹配过滤规则,因此过滤器对该Servlet请求进行了过滤。进行过滤后的Tomcat服务器控制台输出如图5所示。

■ 图5 进行过滤后的Tomcat服务器控制台输出

通过以上结果可以得出以下结论。

(1) 过滤器在服务器启动时也随之初始化。

(2) 当符合过滤规则的URL请求访问时,首先调用Filter的doFilter()函数,对请求进行过滤,过滤完毕后,过滤器执行chain.doFilter(request, response)语句,将请求提交给过滤链中的下一个过滤器。

(3) 当所有过滤器都执行完对请求的过滤后,服务器执行Servlet处理请求的doGet()函数。

(4) 执行完Servlet的代码后,再执行chain.doFilter语句的后续代码。

注意,在上面的例子中,TestFilter类使用了以下注解语句:

@ WebFilter(["/TestServlet"})

 该注解表示对访问URL为/TestServlet的请求进行过滤。和Servlet配置一样,也可以在web.xml文件中对Filter进行过滤规则的配置。上面的注解等价于在web.xml中编写下面的配置语句:

< filter >
< filter - name > TestFilter </filter - name›
< filter - class > com. test. filter. TestFilter </filter - class>
</filter>
< filter - mapping >
< filter - name > TestFilter </filter - name >
< url - pattern >/TestServlet </url - pattern>
</filter - mapping ›

注意,在标签体内部还可以通过和两个标签来设置初始化参数,也可以通过上面创建Filter的第(3)步中的选项卡里的initialization parameters来设置。

事实上,在url-pattern过滤规则中可以非常灵活地指定需要过滤的资源,一般有以下3种。

(1) 过滤一个或多个Servlet或者JSP文件。

① 注解的形式如下:

@WebFilter(! "path/Serwlet1","path/Serwlet2"
"path/xxx. jsp"...})

 ② 在web.xml中编写语句如下:

<filter >
< filter - name >过滤器多称</filter - name >
< filter - class >过滤器的类名</filter - class ></filter >
< filter - mapping >
< filter - name >过滤器名称</filter - name >< url - pattern >/ path/Servlet1 </url - pattern ></filter - mapping >
<filter - mapping >
<filter - name >过滤器名称</filter - name >
< url - pattern >/ path/Servlet2 </url - pattern >/filter - mapping >
<filter - mapping >
<filter - name >过滤器名称</filter - name ><url - pattern >/ path/xxX. jsp </url - pattern >
</filter - mapping >
 

该方式一般针对特定的Servlet或者JSP文件进行过滤处理。

(2) 过滤一个或者多个目录下的资源。

① 注解的形式如下:

@WebFilter({ "path/ *"})
 ② 在web.xml中编写语句如下:

<filter >
< filter - name >过滤器名称</filter - name >
< filter - class >过滤器的类名</filter - class ></filter >
< filter - mapping >
< filter - name>过滤器名称</filter - name ><url - pattern >/ path/ x </url - pattern ></filter - mapping >
 

注意,此时使用了通配符*,表示路径下的所有文件。

(3) 过滤所有文件。

① 注解的形式如下:

@WebFilter({"/*})
 ② 在web.xml中编写语句如下:

< filter >
< filter - name>过滤器名称</filter - name>
< filter - class >过滤器的类名</filter - class ></filter >
<filter - mapping >
< filter - name >过滤器名称</filter - name><url - pattern >/ * </url - pattern ></filter - mapping >

注意,url-pattern内部以“/”开头,“/”表示的是应用系统的根目录。

另外,在内部还可以通过标签更加细化地指定过滤的URL的请求方式,该元素的值有以下4种。

(1) request:直接由客户端输入对应URL的访问请求。

(2) forward:通过request转发中的forward方式跳转的访问请求。

(3) include:通过request转发中的include方式跳转的访问请求。

(4) error:通过跳转的访问请求。

请求方式的配置也可以在图9-4中的Select dispatchers部分进行设置,设置后会直接在注解中生成对应的配置语句。如果没有在配置文件中指定标签元素,也没有在注解中指定,就默认只过滤request方式。

02、监听器的创建与配置
【例2】监听器的创建以及监听事件配置。

(1) 在src目录下创建一个名为com.test.listener的包,选中该包并按Ctrl+N组合键,在弹出的对话框中选择Web→Listener。选择创建监听器,如图6所示,然后单击Next按钮。

■ 图6 选择创建监听器

(2) 在弹出的Create Listerner对话框中对监听器进行命名,如图7所示。在Class name文本框内输入TestListener,单击Next按钮。

■ 图9 选中要监听的事件

(4) 确定监听器对象要实现的接口,如图10所示。单击Finish按钮即可完成对监听器的创建。

■ 图10 确定监听器要实现的接口

此时,IDE自动生成了TestListener.java需要实现的接口方法名称,代码如下:

import javax. servlet. annotation. WebListener;
import javax. servlet. http. HttpSessionAttributeListener;
import javax. servlet. http. HttpSessionBindingEvent;
import javax. servlet. http. HttpSessionEvent;
import javax. servlet. http. HttpSessionListener;
@WebListener
public class TestListener implements HttpSessionListener,
HttpSessionAttributeListener {
public TestListener ( ) |
public void sessionCreated (HttpSessionEvent se) {
}
}
public void sessionDestroyed(HttpSessionEvent se) {
public void attributeAdded (HttpSessionBindingEvent se){
public void attributeRemoved(HttpSessionBindingEvent se) {
public void attributeReplaced(HttpSessionBindingEvent se) {
}
}

 注意,在TestListener类的上面一行出现了@WebListener的注解语句,表明这是一个Web监听器。这条注解等价于在web.xml中编写了如下配置。

< listener >
<listener - class > com.test,listener,Testlistener </listener - class>
</listener >
如果想实现具体的监听功能,就必须实现接口中定义的相关方法。 

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。