JavaWeb开发 - Filter过滤器详解
前言
本章节主要学习JavaWeb开发中的Filter过滤器技术,收录于JavaWeb基础专栏,该专栏主要学习JavaWeb开发原生框架、Servlet、JSP、请求对象、响应对象、Session会话对象、Filter过滤器、三层开发模型等知识点,欢迎童鞋们互相交流。觉得不错可以三连订阅喔。
目标
1. 概念
2. Filter介绍
3. 入门案例
4. 验证登录案例
4.1 登录代码
4.2 过滤器验证
内容
1. 概念
Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。总而言之,过滤器可以将web客户端请求进行拦截,并处理。
2. Filter介绍
Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个Java类称之为过滤器Filter。
通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。
3. 入门案例
新建一个类,实现Filter接口,实现doFilter()方法,打印一句话,来证明能够进行拦截。
使用注解配置过滤器请求路径。
package com.qls.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
/**
* 过滤器:可以拦截web客户端请求,对请求进行处理(判断是否登录、权限验证、敏感词拦截等)
* */
/*
* @WebFilter注解与@WebServlet注解相似
* @WebFilter("/*")拦截所有请求, * 表示所有
* */
@WebFilter("/*")
public class FilterDemo1 implements Filter{
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("过滤器拦截请求,执行代码...");
//将请求放行,进入下一个过滤器,如果没有下一个过滤器,则让请求直接访问资源
chain.doFilter(request, response);
}
}
4. 验证登录案例
在项目开发中,通常需要对web客户端的请求进行验证,若用户未登录,不允许访问登录资源之外的资源,比如首页信息、模块修改删除等功能。
所以需要使用过滤器对登录之外的所有请求进行拦截,并验证用户是否已登录,如果已登录,让该请求访问资源,如果未登录,不允许访问资源,将该请求转发或重定向,跳转到登录页面使其登录。
4.1 登录代码
登录网页 login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>XXX系统</title>
</head>
<body>
<h1>用户登录</h1>
<form action="login" method="post">
<input type="text" name="username"><br><br>
<input type="password" name="password"><br><br>
<button type="submit">登录</button>
</form>
</body>
</html>
处理登录请求LoginServlet.java
package com.qls.servlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.qls.utils.DBUtils;
/**
* 处理登录请求
*/
//接收登录请求
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求中的用户数据
String username = request.getParameter("username");
String password = request.getParameter("password");
//创建Session对象,用来存储用户数据
HttpSession session = request.getSession();
//使用工具类获取数据库连接
DBUtils db = new DBUtils();
try {
Connection conn = db.getConn();
//编写SQL语句
String sql = "select username,password from user where username=? and password=?";
//与处理对象
PreparedStatement ps = conn.prepareStatement(sql);
//设置SQL语句中的参数
ps.setString(1, username);
ps.setString(2, password);
//执行SQL语句,获得结果集
ResultSet rs = ps.executeQuery();
//处理结果集
while(rs.next()) {
//获取结果集中的数据
String uname = rs.getString("username");
String pword = rs.getString("password");
//判断请求中的用户数据与结果集中的用户数据是否相同
if(username.equals(uname) && password.equals(pword)) {
//登录成功,将用户账号信息存入Session会话对象中
session.setAttribute("username", username);
//请求转发 跳转到主页
request.getRequestDispatcher("/user/show").forward(request, response);
}else {
//重定向,跳转到登录页面
response.sendRedirect("login.html");
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4.2 过滤器验证
package com.qls.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* 验证用户是否登录
* */
//拦截除登录请求之外的所有用户请求
@WebFilter("/user/*")
public class LoginFilter implements Filter{
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//获取session对象 ((HttpServletRequest) request).getSession();
//将ServletRequest类型的request对象转换为HttpServletRequest类型的req请求对象
HttpServletRequest req = (HttpServletRequest)request;
//获取session对象
HttpSession session = req.getSession();
//从session中获取用户数据
String username = (String) session.getAttribute("username");
/*
* 判断session中的是否有用户数据
* 若有数据,表示用户已登录,将请求放行,访问资源
* 若没有数据,表示用户未登录,将请求转发到登录页面
*/
if(username != null && username != "") {
System.out.println("已登录");
//放行
chain.doFilter(request, response);
}else {
//未登录 跳转到指定网页
req.getRequestDispatcher("login.html").forward(req, response);
}
}
}