servlet过滤器与监听器

 

1.运行环境

jdk1.8.0_77 Intellij IDEA2018.3 x64

2.过滤器

过滤器Filter

过滤器是Servlet中最令人激动的特性之一,当浏览器发送请求给服务器时,服务器会先执行过滤器,然后才访问web资源。服务器响应请求,在web资源抵达浏览器之前,也会途径过滤器。
过滤器可以做什么

你可以把过滤器想象成一张过滤网,服务器与浏览器的信息交互都要经过过滤器以保证满足标准。使用过滤器可以过滤一些敏感字符串,可以避免中文乱码,可以进行权限验证(比如规定只有带session和cookie的浏览器才可以访问资源)等等。
过滤器的出现使得一些棘手的问题得以解决,最通俗的体现就在于处理中文乱码,我们都知道,只有使用utf-8编码才能使得全世界各地的字符得以正确显示。不使用过滤器的话我们就需要在所有的servlet和jsp中对编码加以声明,代码的重复率相当高。
过滤器示例——处理中文乱码

只要java类实现了Filter接口就可以成为过滤器。
一个标准的过滤器:

新建Servlet实现Filter接口,重写其方法:

package com.xx.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;

// 实现Filter接口就可以称之为过滤器
public class EncodingFilter implements Filter {
// 构造方法
public EncodingFilter() {
// TODO Auto-generated constructor stub
}

// 销毁方法,与Servlet中的destory方法类似
public void destroy() {
// TODO Auto-generated method stub
}

// doFilter方法,在这里实现过滤器功能
// 它有三个参数(ServletRequest,ServletResponse,FilterChain)
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

// 我们把处理中文乱码的代码放在这里就可以了
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");

// pass the request along the filter chain
// 在Java中使用了链式结构来管理过滤器。把所有的过滤器都放在FilterChain里边
// 如果符合条件,就执行下一个过滤器(如果没有过滤器了,就执行目标资源)。
chain.doFilter(request, response);
}

// 初始化方法,和destory方法都只执行一次
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}

}

3.监听器

监听器Listener

监听器其实就是一个实现了特定接口普通java程序,这个程序专门用来监听一个java对象的方法调用或者属性改变,当被监听的对象的事件发生后,监听器就会立即捕捉到,并做以响应的处理。
我们把被监听的对象称作事件源。在Servlet规范中定义了多种类型的监听器,我们可以使用监听器来监听 ServletContext,HttpSession和HttpServletRequest这三个作用域对象。监听的内容分为:监听域对象的创建和销毁,监听域对象的属性变化
ServletContext HttpSession HttpServletRequest
域对象的创建和销毁 ServeltContextListener HttpSessionListener ServeltRequestListener
域对象属性的变化 ServeltContextAttributeListener HttpSessionAttributeListener ServeltRequestAttributeListener

我们可以根据实际要求去实现不同的接口以监听目标事件源。

监听器的部署,写在web.xml文件当中:

<listener>
<listener-class>com.xx.listener.CountOnlineUserListener</listener-class>
</listener>

1
2
3

监听器示例——统计在线人数

我们先来新建一个简单的登录页面:

<html>
<head>
<meta charset="UTF-8">
<style type="text/css">
body{text-align:center;}
span{ color:red; font-size:200% }
hr{ margin-bottom:30px }
</style>
</head>
<body>
<span> 登录 </span>
<hr color="red"/>
<form action="LoginServlet" method="post">
<table border="1" bordercolor="blue" width="40%" cellspacing="0" align="center">
<tr>
<td>用户名:</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"/></td>
</tr>
<tr align="center">
<td colspan="2">
<input type="submit" value="登陆"/> <input type="reset" value="重置"/>
</td>
</tr>
</table>
</form>
</body>
</html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

看下效果:
在这里插入图片描述
现在来新建LoginServlet:

package com.xx.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* Servlet implementation class LoginServlet
*/
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 模拟登陆后在首页显示当前在线人数
String username = request.getParameter("username");
String password = request.getParameter("password");
// 拿到用户输入的用户名和密码后,我们自然是拿去和数据库中的数据做校验
// 我们假设校验成功,然后跳转到首页页面
response.sendRedirect("IndexServlet");
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}

}

4.心得

做项目和生活一样

一定要有条有序

有头有尾

才能完成

原文地址:https://www.cnblogs.com/nanren/p/13662044.html