Filter
接口,并在 web.xml
或使用注解进行配置。doFilter
方法是 Filter 的核心,处理业务逻辑后必须调用 filterChain.doFilter(servletRequest, servletResponse)
将请求向后传递。init
方法进行初始化。doFilter
方法会被调用。destroy
方法销毁 Filter 对象。web.xml
中的配置顺序决定,或者根据注解的定义顺序。init
方法:只调用一次,在 Filter 实例化后进行初始化操作。doFilter
方法:调用多次,每次请求匹配 Filter 的 URL 模式时都会执行。destroy
方法:只调用一次,在 Tomcat 关闭时销毁 Filter 实例,释放资源。<input>
标签的 type
属性设置为 file
,用于选择文件。<form>
标签的 method
属性设置为 post
。<form>
标签的 enctype
属性设置为 multipart/form-data
,以二进制形式传输数据。DiskFileItemFactory
和 ServletFileUpload
解析请求,获取 FileItem
对象列表。FileItem
对象,区分普通表单字段和文件字段。<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传">
</form>
DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
List<FileItem> list = servletFileUpload.parseRequest(req);
for (FileItem fileItem : list) {
if (!fileItem.isFormField()) {
String fileName = fileItem.getName();
InputStream inputStream = fileItem.getInputStream();
String path = req.getServletContext().getRealPath("file/" + fileName);
OutputStream outputStream = new FileOutputStream(path);
int temp = 0;
while ((temp = inputStream.read()) != -1) {
outputStream.write(temp);
}
outputStream.close();
inputStream.close();
}
}
A: Filter 可以通过设置 ServletRequest
的字符编码为 UTF-8 来统一处理中文乱码。例如:
public class CharacterFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("UTF-8");
filterChain.doFilter(servletRequest, servletResponse);
}
}
A: Filter 可以通过检查用户的登录状态来控制资源的访问权限。例如,检查 HttpSession
中是否存在用户信息,如果不存在则重定向到登录页面。
public class DownloadFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession();
String name = (String) session.getAttribute("name");
if (name == null) {
response.sendRedirect("/login.jsp");
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
enctype="multipart/form-data"
的作用是什么?A: enctype="multipart/form-data"
用于指定表单数据以多部分形式进行编码,以便能够传输文件数据。这种编码方式将表单数据分成多个部分,每个部分包含一个字段的数据,其中文件数据以二进制流的形式传输。
A: 使用 Apache Commons FileUpload 组件处理文件上传的步骤如下:
DiskFileItemFactory
对象,用于配置磁盘存储。ServletFileUpload
对象,并传入 DiskFileItemFactory
对象。ServletFileUpload
的 parseRequest
方法解析请求,获取 FileItem
对象列表。FileItem
对象,区分普通表单字段和文件字段。本文档适合Java Web初学者、Java Web开发工程师以及需要了解Filter和文件上传下载的开发人员。读者应具备一定的Java基础知识和Web开发经验,了解Servlet、JSP等基本概念。
在早期的Java Web开发中,Servlet是处理HTTP请求的主要组件。随着Web应用复杂度的增加,需要在请求到达Servlet之前或响应返回客户端之后进行一些预处理或后处理操作,例如字符编码转换、安全检查、日志记录等。Filter应运而生,它提供了一种声明式的方式来拦截和处理HTTP请求和响应,无需修改Servlet的代码,实现了AOP(面向切面编程)的思想,提高了代码的复用性和可维护性。