Filter过滤器
在平常访问网站的时候,有时候发一些敏感的信息,发出后显示时就会将敏感信息用*等字符替代,这就是过滤器对信息进行了处理。它不仅能预处理数据,只要发送过来的请求它都是可以预处理,同时它还可以对服务器返回的响应进行预处理,大大减轻了服务器的压力。
Filter 过滤器它是 Java Web 的三大组件之一。
三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
Filter 过滤器它是 Java EE 的规范。也就是接口
-
Filter 过滤器它的作用是:拦截请求,过滤响应。
-
拦截请求常见的应用场景有:
- 1、权限检查
- 2、日记操作
- 3、事务管理
-
拦截请求常见的应用场景有:1.权限检查2.日记操作
概念
它主要起过滤作用,对从客户端向服务器发送的请求进行过滤,也可以对服务器端返回的响应进行处理。它使用户可以改变一个request和修改一个response。
Filter不是一个servlet,它不能产生一个response,但是它能在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response。换句话说,filter其实就是客户端与servlet中间的一个传递者,并且它可以对要传递的东西进行修改。


**javax.servelt.Filter**是一个接口
过滤器能够在浏览器发出的请求到达请求资源目标前运行一些代码,通常是用来检查这个请求是不是满足某些要求,如果发现特定条件成立,可以阻止请求访问这个资源。
为什么使用过滤器
过滤器不但能过滤servlet的请求,还能过滤访问图片、页面等的请求,如果多个servlet有相同的代码,我们可以将这些代码提取到过滤器种,减少代码冗余。【过滤器可以减少代码冗余,避免一些非正确的请求。】
具体使用
如:必须登录以后才能访问项目中的页面,这样导致我们在很多的servlet中编写了判断session中是否包含信息的逻辑,如果有过滤器,我们只要编写一次就可以了。
使用filter的三个步骤:
- 定义类,实现Filter接口,并重写所有方法
- 配置Filter拦截资源路径,在类上通过
WebFilter("/*")来配置 (/*)表示拦截所有资源 - 在
doFilter方法中完成具体过滤
案例编写
我们首先编写一个MyFilter
package filters;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/*
* 运行的顺序
* init初始化
* doFilter 具体处理请求是否过滤的方法
* destroy 最终销毁方法
* */
@WebFilter("/*")
///*表示访问所有资源前都要经过过滤器
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//初始化
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//放行 如果不写这行代码则所有请求都被过滤掉了
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
//销毁
}
}
注意doFilter()方法中什么也不写的话就表示什么都
登录注册进阶
使用之前的登录注册,从零开始servlet-jdbc-mysql登录注册实现https://blog.csdn.net/zhulir/article/details/148049458?spm=1011.2415.3001.5331
设主页面只能在登录状态下访问。使用过滤器验证用户登录状态
在这个项目中,login.html、register.html时登录和注册界面,我们把demo.html当成项目的主页,此时我们想访问主页必须要保证登录状态,所以我们需要在Login Servlet中添加Session记录用户数据。
1、首先在Login Servlet中添加session,用于记录用户数据
当用户名密码正确的时候,创建session对象
@WebServlet("/user/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置字符集
request.setCharacterEncoding("UTF-8");
//获取用户的请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
//处理和数据库的连接
Connection conn = DruidUtils.getConnection();
String sql = "select count(*) from users where username=? and password=?";
try {
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);
ResultSet rs =pstmt.executeQuery();
while(rs.next()) {
int num = rs.getInt(1);
if (num > 0) {
//登录成功处理
System.out.println(username);
HttpSession session = request.getSession();
session.setAttribute("username", username);
//重定向到主页
response.sendRedirect(request.getContextPath() + "/demo.html");
} else {
// 登录失败处理
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("登录失败!用户名或者密码失败!");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2、重写doFilter方法:
@WebFilter("/demo.html")
///*表示访问所有资源前都要经过过滤器
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//初始化
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//将过滤器中的请求和响应对象转换为HTTP协议封装的
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//检查用户是否登录
HttpSession session = request.getSession();
//获取用户信息
String user=(String)session.getAttribute("username");
if(user!=null){
//允许访问主页面
filterChain.doFilter(servletRequest, servletResponse);
}else{
//用户没有登录
response.sendRedirect(response.encodeRedirectURL(request.getContextPath()+"/login.html"));
}
}
@Override
public void destroy() {
//销毁
}
}
运行项目发现,访问demo.html会自动转成访问login.html界面。
Filter过滤器路径配置
过滤路径表示Filter会对请求的哪些资源进行过滤,使用@WebFilter注解进行配置。如:@WebFilter("过滤路径")。过滤路径有四种方式配置:
- 过滤具体的资源:/index.jsp 只有访问index.jsp时才会被拦截
- 目录过滤:/user/* :访问/user下的所有资源都会被拦截
- 后缀名过滤:*.jsp :访问后缀名为jsp的资源都会被拦截
- 过滤所有:/* :访问所有资源都会被拦截
Filter过滤器链
在一个WEB应用里,可以配置多个过滤器,多个过滤器就会组成过滤器链

多个过滤器链存在优先级问题,以注解方式配置的Filter过滤器,它的执行优先级是按时过滤器类名的自动排序确定的,类名排名越靠前,优先级越高。
比如有如下两个过滤器:BFilter、AFilter。那一定时AFilter过滤器先执行。
1162

被折叠的 条评论
为什么被折叠?



