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(面向切面编程)的思想,提高了代码的复用性和可维护性。