Filter过滤器
1.1 基本概念
- Filter本意为”过滤“的含义,是JavaWeb的三大组件之一,三大组件为:Servlet、Filter、Listener。
- 过滤器是向 Web 应用程序的请求和响应处理添加功能的 Web 服务组件。
- 过滤器相当于浏览器与Web资源之间的一道过滤网,在访问资源之前通过一系列的过滤器对请求
进行修改、判断以及拦截等,也可以对响应进行修改、判断以及拦截等。
1.2 Filter原理
1.3 Filter基本使用
1.3.1 login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录页面</title>
</head>
<body>
<form action="login" method="post">
用户姓名: <input type="text" name="userName"><br/>
用户密码: <input type="password" name="password"><br/>
<input type="submit" value="注册"/>
</form>
</body>
</html>
1.3.2 LoginServlet
package cn.guardwhy.servlet;
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 java.io.IOException;
/*
控制器:Servlet
*/
@WebServlet(name = "LoginServlet", urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.获取请求中的用户名和密码
String userName = request.getParameter("userName");
System.out.println("获取到的用户名:" + userName);
String password = request.getParameter("password");
System.out.println("获取到的密码:" + password);
// 2.用户名和密码校验
if("Curry".equals(userName) && "1234".equals(password)){
System.out.println("登录成功,欢迎使用");
// 3.存储用户信息
request.getSession().setAttribute("userName", userName);
// 4.重定向
response.sendRedirect("main.jsp");
}else {
System.out.println("用户名或者密码错误,请重新输入...");
// 5.转发
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
}
1.3.3 main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>页面主题</title>
</head>
<body>
<h3>登录成功,欢迎${sessionScope.username}使用</h3>
</body>
</html>
1.3.4 LoginFilter
package cn.guardwhy.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/*
拦截器
*/
public class LoginFilter implements Filter {
@Override
// web服务器启动,过滤器开始初始化,随时等待过滤对象出现。
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器开始初始化");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
// 0.设置编码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
// 1.获取session对象
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpSession session = httpServletRequest.getSession();
// 2.得到用户名
Object userName = session.getAttribute("userName");
// 3.获取Servlet请求路径
String servletPath = httpServletRequest.getServletPath();
// 4.假设没有登录,则返回登录页面
if(null == userName && !servletPath.contains("login") ){
// 转发
request.getRequestDispatcher("login.jsp").forward(request, response);
}else{
// 5.登录则放行
filterChain.doFilter(request, response);
}
}
@Override
// web服务器关闭的时候,过滤器销毁
public void destroy() {
System.out.println("过滤器销毁。。");
}
}
1.3.5 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--过滤器-->
<filter>
<filter-name>LoginServlet</filter-name>
<filter-class>cn.guardwhy.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginServlet</filter-name>
<url-pattern>/main.jsp</url-pattern>
<!--<url-pattern>/*</url-pattern>-->
</filter-mapping>
</web-app>
执行结果

1.4 Filter接口
1.4.1 基本概念
javax.servlet.Filter接口主要用于描述过滤器对象,可以对资源的请求和资源的响应操作进行筛选操作。
1.4.2 常用的方法
| 方法声明 | 作用 |
|---|---|
| void init(FilterConfig filterConfig) | 实现过滤器的初始化操作。 |
| void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) | 执行过滤操作的功能。 |
| void destroy() | 实现过滤器的销毁操作。 |
1.5 FilterConfig接口
1.5.1 基本概念
javax.servlet.FilterConfig接口主要用于描述过滤器的配置信息。
1.5.2 常用方法
| 方法声明 | 作用 |
|---|---|
| String getFilterName() | 获取过滤器的名字。 |
| String getInitParameter(String name) | 获取指定的初始化参数信息。 |
| Enumeration getInitParameterNames() | 获取所有的初始化操作名称 |
| ServletContext getServletContext() | 获取ServletContext对象。 |
代码示例
package cn.guardwhy.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Enumeration;
/*
拦截器
*/
public class LoginFilter implements Filter {
@Override
// web服务器启动,过滤器开始初始化,随时等待过滤对象出现。
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化操作正在火热进行中...");
System.out.println("获取到的过滤器名称为:" + filterConfig.getFilterName());
String userName = filterConfig.getInitParameter("userName");
System.out.println("获取到指定初始化参数的数值为:" + userName);
Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();
while (initParameterNames.hasMoreElements()) {
System.out.println("获取到的初始化参数名为:" + initParameterNames.nextElement());
}
ServletContext servletContext = filterConfig.getServletContext();
System.out.println("获取到的上下文对象是:" + servletContext);
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
}
@Override
public void destroy() {
}
}
1.6 多个过滤器
如果有多个过滤器都满足过滤的条件,则容器依据映射的先后顺序来调用各个过滤器。

浙公网安备 33010602011771号