三分钟了解WEB的过滤器和监听器
过滤器和监听器
一.过滤器
1.简介
Filter 即为过滤,用于在 Servlet 之外对 Request 或者 Response 进行修改。它主要用于对用户请求进行预处理,也可以对 HttpServletResponse 进行后处理。使用 Filter 的完整流程: Filter 对用户请求进行预处理,接着将请求交给 Servlet进行处理并生成响应,最后 Filter 再 对服务器响应进行后处理。在一个 web 应用中,可以开发编写多个 Filter,这些 Filter 组合 起来称之为一个 Filter 链.
若是一个过滤器链:先配置先执行(请求时的执行顺序);响应时: 以相反的顺序执行。
2.实现
通过实现一个叫做 javax.servlet.Fileter 的接口来实现一个过滤器,其中定义了 三个方法,init(), doFilter(), destroy()分别在相应的时机执行。后期观察生命周期。 Filter 的实现只需要两步:
Step1: 编写 java 类实现 Filter 接口,并实现其 doFilter 方法。
Step2: 在 web.xml 文件中对编写的 filter 类进行注册,并设置它所能拦截的资源.
实现Filter过滤器的步骤:1)、新建普通java类;2)、实现Filter接口;3)、实现接口中的方法;4)、设置web.xml的配置文件
配置文件如下:
<filter-mapping>
<filter-name>Filter01</filter-name>
<url-pattern>/login.html</url-pattern><!-- 需要拦截的路径,也可以同时配置多个,通常设置为 /* -->
<url-pattern>/*</url-pattern>
</filter-mapping>
Init()方法,只初始化一次,即就是服务器打开时初始化;
doFilter()方法,放行,即就是让需要通过的请求进行通过;
destroy()方法,销魂过滤器.这三种方法的使用构成过滤器的生命周期.
web 服务器在调用 doFilter 方法时,会传递一个 filterChain 对象进来,filterChain 对象是 filter 接口中最重要的一个对象,它提供了一个 doFilter 方法,开发人员可以根据需求决定 是否调用此方法,调用该方法,则 web 服务器就会调用 web 资源的 service 方法,即 web 资源就会被访问,否则 web 资源不会被访问。(本质是放行,调用 doFilter 方法后,即请求可以到达资源)
二.监听器
1.简介
web 监听器是一种 Servlet 中的特殊的类,它们能帮助开发者监听 web 中的特定事件, 比如 ServletContext, HttpSession,
ServletRequest的创建和销毁;变量的创建、销毁和修改等。 可以在某些动作前后增加处理,实现监控。例如可以用来统计在线人数等
2.实现
监听器有三类8种:⑴监听生命周期:实现接口 ServletRequestListener、HttpSessionListener 、 ServletContextListener⑵监听值的变化:实现接口ServletRequestAttributeListener,HttpSessionAttributeListener、ServletContextAttributeListener ⑶针对 session 中的对象:监听 session 中的java 对象(javaBean) 是 javaBean 直接实现监听器 的接口。这里我们只做一个简单的演示。假设我们想做一个对在线人数的监控。
Step1:创建一个监听器,需要实现某种接口,根据需求选取HttpSessionListener
Step2:在 web.xml 中配置该监听器创建一个类,并实现 HttpSessionListener 接口,用来检测 Session 的创建和销毁。 在类中定义一个成员变量用来存储当前的 session 个数。
三.JDBC实现登录操作
1.表单提交
(1).工具类
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
/**
*@author:
*数据库工具类
*
*/
public class DBUtil {
//得到配置文件对象
private static Properties properties=new Properties();
static{
//得到输入流的对象
InputStream inputstream=DBUtil.class.getClassLoader().getResourceAsStream("db.properties");
//加载配置文件
try {
properties.load(inputstream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 连接数据库
*
* */
public static Connection getConnection(){
Connection connection=null;
//从配置文件中得到参数
String jdbcName=properties.getProperty("jdbcName");
String dbUrl=properties.getProperty("dbUrl");
String dbName=properties.getProperty("dbName");
String dbPwd=properties.getProperty("dbPwd");
try {
//1.加载驱动
Class.forName(jdbcName);
//2.连接数据库
connection=DriverManager.getConnection(dbUrl,dbName,dbPwd);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return connection;
}
//关闭资源
public static void close(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet){
try {
if(resultSet != null){
resultSet.close();
}
if (preparedStatement != null) {
preparedStatement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
System.out.println(getConnection());
}
}
(2)后台操作
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.shsxt.user.User;
import com.shsxt.util.DBUtil;
import com.shsxt.util.StringUtil;
/**
* 通过数据库进行查询操作
*/
public class Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
formSubmit(request, response);
}
/**
* 步骤
* 1、得到数据库连接
* 2、准备sql语句
* 3、预编译sql语句
* 4、设置参数,下标从1开,按照参数的顺序设置
* 5、执行查询,返回resultSet结果集
* 6、判断并分析结果集,得到user对象
* 7、关闭资源
*
*
* */
public User findUserByUnameAndUpwd(String uName, String uPwd){
//设置全局变量
User user=null;
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
try {
//1.得到数据库
connection=DBUtil.getConnection();
//2.准备SQL语句并使用"?"进行占位
String sql="select * from tb_user where uName = ? and uPwd = ?";
//3.预编译SQL语句
preparedStatement=connection.prepareStatement(sql);
//4.设置参数
preparedStatement.setString(1, uName);
preparedStatement.setString(2, uPwd);
//5.执行查询,返回结果集
resultSet=preparedStatement.executeQuery();
//6.判断并分析结果集
if(resultSet.next()){
user=new User();
user.setuId(resultSet.getInt("uId"));
user.setuName(resultSet.getString("uName"));
user.setuPwd(uPwd);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//关闭资源
DBUtil.close(connection, preparedStatement, resultSet);
}
return user;
}
//表单登录
public void formSubmit(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 接收参数
String uname = request.getParameter("uname");
String upwd = request.getParameter("upwd");
// 设置响应类型及编码
response.setContentType("text/html;charset=UTF-8");
// 得到输出流
PrintWriter out = response.getWriter();
// 非空判断
if (StringUtil.isEmpty(uname) || StringUtil.isEmpty(upwd)) {
out.write("<h3>用户名或密码不能为空!</h3><h4><a href='login.html'>返回登录</a></h4>");
out.close();
return;
}
// 从数据库中查询用户对象是否存在
User user = findUserByUnameAndUpwd(uname, upwd);
// 判断用户对象是否存在
if (user == null) {
out.write("<h3>用户名称或密码不正确!</h3><h4><a href='login.html'>返回登录</a></h4>");
out.close();
return;
}
// 登录成功跳转到首页
response.sendRedirect("index.html");
}
}
(3)前台操作
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<form action="Servlet" method="post">
姓名:<input type="text" name="uname" id="uname" /> <br/>
密码:<input type="password" name="upwd" id="upwd" /> <br/>
<input type="button" value="登录" onclick="checkForm()" />
<span id="msg" style="font-size:12px;color:red"></span>
<input type="hidden" name="actionName" value="form" />
</form>
</body>
<script type="text/javascript" src="js/jquery-3.4.1.js"></script>
<script type="text/javascript">
/*
* 验证表单
*/
function checkForm(){
// 获取用户名
var uname = $("#uname").val();
// 判断是否为空
if (uname.length < 1) {
$("#msg").html("姓名不能为空!");
return;
}
// 获取密码
var upwd = $("#upwd").val();
// 判断是否为空
if (upwd.length < 1) {
$("#msg").html("密码不能为空!");
return;
}
// 提交表单
$("form").submit();
}
</script>
</html>
2.表单提交和ajax提交随意选择
(1).工具类
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
/**
*@author:
*数据库工具类
*
*/
public class DBUtil {
//得到配置文件对象
private static Properties properties=new Properties();
static{
//得到输入流的对象
InputStream inputstream=DBUtil.class.getClassLoader().getResourceAsStream("db.properties");
//加载配置文件
try {
properties.load(inputstream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 连接数据库
*
* */
public static Connection getConnection(){
Connection connection=null;
//从配置文件中得到参数
String jdbcName=properties.getProperty("jdbcName");
String dbUrl=properties.getProperty("dbUrl");
String dbName=properties.getProperty("dbName");
String dbPwd=properties.getProperty("dbPwd");
try {
//1.加载驱动
Class.forName(jdbcName);
//2.连接数据库
connection=DriverManager.getConnection(dbUrl,dbName,dbPwd);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return connection;
}
//关闭资源
public static void close(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet){
try {
if(resultSet != null){
resultSet.close();
}
if (preparedStatement != null) {
preparedStatement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
System.out.println(getConnection());
}
}
(2)后台操作
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.shsxt.model.User;
import com.shsxt.util.DBUtil;
import com.shsxt.util.StringUtil;
/**
* 用户登录
*/
public class UserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 接收参数 (用来区分当前是什么操作)
String actionName = request.getParameter("actionName");
// actionName=form表示表单提交;actionName=ajax表示ajax提交
if ("form".equals(actionName)) {
// 表单登录
formSubmit(request, response);
} else if ("ajax".equals(actionName)) {
// ajax登录
ajaxSubmit(request, response);
}
}
/**
* ajax登录
* @param request
* @param response
* @throws IOException
*/
private void ajaxSubmit(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 接收参数
String uname = request.getParameter("userName");
String upwd = request.getParameter("userPwd");
// 设置响应类型及编码
response.setContentType("text/html;charset=UTF-8");
// 得到输出流
PrintWriter out = response.getWriter();
// 非空判断
if (StringUtil.isEmpty(uname) || StringUtil.isEmpty(upwd)) {
out.write("用户名或密码不能为空!");
out.close();
return;
}
// 从数据库中查询用户对象是否存在
User user = findUserByUnameAndUpwd(uname, upwd);
// 判断用户对象是否存在
if (user == null) {
out.write("用户名称或密码不正确!");
out.close();
return;
}
// 登录成功
out.write("Success");
out.close();
}
/**
* 表单登录
* @param request
* @param response
* @throws IOException
*/
public void formSubmit(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 接收参数
String uname = request.getParameter("uname");
String upwd = request.getParameter("upwd");
// 设置响应类型及编码
response.setContentType("text/html;charset=UTF-8");
// 得到输出流
PrintWriter out = response.getWriter();
// 非空判断
if (StringUtil.isEmpty(uname) || StringUtil.isEmpty(upwd)) {
out.write("<h3>用户名或密码不能为空!</h3><h4><a href='login.html'>返回登录</a></h4>");
out.close();
return;
}
// 从数据库中查询用户对象是否存在
User user = findUserByUnameAndUpwd(uname, upwd);
// 判断用户对象是否存在
if (user == null) {
out.write("<h3>用户名称或密码不正确!</h3><h4><a href='login.html'>返回登录</a></h4>");
out.close();
return;
}
// 登录成功跳转到首页
response.sendRedirect("index.html");
}
/**
* 通过用户名和密码查询用户对象
* 1、得到数据库连接
* 2、准备sql语句
* 3、预编译sql语句
* 4、设置参数,下标从1开,按照参数的顺序设置
* 5、执行查询,返回resultSet结果集
* 6、判断并分析结果集,得到user对象
* 7、关闭资源
* @param userName
* @param userPwd
* @return
*/
public User findUserByUnameAndUpwd (String userName, String userPwd) {
User user = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
// 1、得到数据库连接
connection = DBUtil.getConnection();
// 2、准备sql语句
String sql = "select * from tb_user where userName = ? and userPwd = ? ";
// 3、预编译sql语句
preparedStatement = connection.prepareStatement(sql);
// 4、设置参数,下标从1开,按照参数的顺序设置
preparedStatement.setString(1, userName);
preparedStatement.setString(2, userPwd);
// 5、执行查询,返回resultSet结果集
resultSet = preparedStatement.executeQuery();
// 6、判断并分析结果集,得到user对象
/*while (resultSet.next()) {
}*/
if (resultSet.next()) { // 如果返回true,表示查询到数据;否则未查询到数据
user = new User();
user.setUserId(resultSet.getInt("userId"));
user.setUserName(resultSet.getString("userName"));
user.setUserPwd(userPwd);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 7、关闭资源
DBUtil.close(connection, preparedStatement, resultSet);
}
return user;
}
public static void main(String[] args) {
System.out.println(new UserServlet().findUserByUnameAndUpwd("zhangsan", "123456"));
}
}
(3)前台操作
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
姓名:<input type="text" name="uname" id="uname" /> <br/>
密码:<input type="password" name="upwd" id="upwd" /> <br/>
<input type="button" value="登录" onclick="checkForm()" />
<span id="msg" style="font-size:12px;color:red"></span>
</body>
<script type="text/javascript" src="js/jquery-3.4.1.js"></script>
<script type="text/javascript">
/*
* 验证表单
*/
function checkForm(){
// 获取用户名
var uname = $("#uname").val();
// 判断是否为空
if (uname.length < 1) {
$("#msg").html("姓名不能为空!");
return;
}
// 获取密码
var upwd = $("#upwd").val();
// 判断是否为空
if (upwd.length < 1) {
$("#msg").html("密码不能为空!");
return;
}
// 发送ajax请求
$.ajax({
typr:"post",
url:"userServlet",
data:{
userName:uname,
userPwd:upwd,
actionName:"ajax"
},
success:function(result) {
if (result == "Success") {
// js跳转
window.location.href = "index.html";
} else {
$("#msg").html(result);
}
}
});
}
</script>
</html>