Servlet 规范扩展 ---- Filter接口(过滤器接口):
1、介绍:
1)来自于 Servlet 规范下接口,在 Tomcat 中存在于 servlet-api.jar 包。
2)Filter 接口实现类由开发人员负责提供,Http 服务器不负责提供。
3)Filter 接口在 Http 服务器调用资源文件之前,对 Http 服务器进行拦截。
2、具体作用:
1)拦截 Http 服务器,帮助 Http 服务器检测当前请求合法性。
2)拦截 Http 服务器,对当前请求进行增强操作。
3、Filter 接口实现类开发步骤(三步):
1)创建一个 Java 类实现 Filter 接口。
2)重写 Filter 接口中 doFilter 方法。
3)web.xml 将过滤器接口实现类注册到 Http 服务器。
4、Filter 拦截地址格式:
1)命令格式(oneFilter 为 我们写的一个过滤器接口实现类):
<filter-mapping>
<filter-name>oneFilter</filter-name>
<url-pattern>拦截地址</url-pattern>
</filter-mapping>
2)命令作用:拦截地址通知 Tomcat 在调用 ?? 资源文件之前需要调用 OneFilter 过滤进行拦截。
3)要求 Tomcat 在调用某一个具体文件之前,来调用 OneFilter 拦截
<url-pattern>/img/mm.jpg</url-pattern>
4)要求 Tomcat 在调用某一个文件夹下所有的资源文件之前,来调用 OneFilter 拦截
<url-pattern>/img/*</url-pattern>
5)要求 Tomcat 在调用任意文件夹下某种类型文件之前,来调用 OneFilter 拦截
<url-pattern>*.jpg</url-pattern>
6)要求 Tomcat 在调用网站中任意文件时,来调用 OneFilter 拦截
<url-pattern>/*</url-pattern>
通过过滤器优化在线考试系统的安全性:
- com.burnyouth.controller.LoginServlet(实现登录验证功能):
package com.burnyouth.controller;
import com.burnyouth.dao.UserDao;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userName, password;
UserDao dao = new UserDao();
int result = 0;
request.setCharacterEncoding(\"utf-8\");
userName = request.getParameter(\"userName\");
password = request.getParameter(\"password\");
result = dao.login(userName,password);
if (result == 1) {
//在判断来访用户合法后,通过请求对象向 Tomcat 申请为当前用户申请一个 HttpSession
HttpSession session = request.getSession();
response.sendRedirect(\"/myWeb/index.html\");
} else {
response.sendRedirect(\"/myWeb/login_error.html\");
}
}
}
- com.burnyouth.filter.OneFilter(实现拒绝非法用户请求内部文件资源的功能):
package com.burnyouth.filter;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
public class OneFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//将 ServletRequest 强转为 HttpServletRequest,以调用getRequestDispatcher()
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpSession session = null;
//调用请求对象读取请求协议包中的URI,了解用户要访问的资源文件是什么
String uri = request.getRequestURI();
//如果本次请求资源文件与登录有关(login.html或者/myWeb等),应该无条件放行
if (uri.indexOf(\"login\") != -1 || \"/myWeb/\".equals(uri)) {
filterChain.doFilter(servletRequest,servletResponse);
return;
}
//如果本次请求访问的是其他资源文件,需要判断用户是否已经登录过了(判断HttpSession是否被创建)
session = request.getSession(false);
//判断来访用户是否合法
if (session == null) {
request.getRequestDispatcher(\"/login_error.html\").forward(servletRequest,servletResponse);
return;
}
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
}
xml(仅展示过滤器相关代码):
<filter>
<filter-name>OneFliter</filter-name>
<filter-class>com.burnyouth.filter.OneFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OneFliter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
最终版互联网通信原理图:
来源:https://www.cnblogs.com/Burning-youth/p/16016741.html
本站部分图文来源于网络,如有侵权请联系删除。