目录
过滤器的作用与工作原理
JSP 过滤器(Filter)是 Java Servlet 规范的一部分,用于拦截客户端请求和服务器响应,在请求到达 JSP/Servlet 或响应返回客户端前执行预处理或后处理任务。过滤器通过实现 javax.servlet.Filter
接口工作,常用于日志记录、权限验证、字符编码设置等。
过滤器的工作原理基于责任链模式,请求和响应通过过滤器链(Filter Chain)依次处理。
创建和配置过滤器
2.1 实现 Filter 接口
- 方法:
init(FilterConfig config)
:初始化过滤器。doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
:执行过滤逻辑。destroy()
:销毁过滤器。- 示例:
import javax.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
// 初始化代码
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 前置处理
System.out.println("请求被拦截");
chain.doFilter(request, response); // 放行到下一个过滤器或目标资源
// 后置处理
}
public void destroy() {
// 清理代码
}
}
2.2 配置过滤器
- 方式 1:在 web.xml 中配置:
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.example.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 方式 2:使用注解(Servlet 3.0+):
import javax.servlet.annotation.WebFilter;
@WebFilter("/*")
public class MyFilter implements Filter {
// 同上实现
}
常见的过滤器应用
3.1 字符编码过滤
- 作用:统一设置请求和响应的字符编码,避免乱码。
- 示例:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
3.2 权限验证过滤
- 作用:检查用户是否登录,未登录则重定向到登录页面。
- 示例:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
HttpSession session = req.getSession(false);
if (session == null || session.getAttribute("user") == null) {
resp.sendRedirect("login.jsp");
} else {
chain.doFilter(request, response);
}
}
示例代码
- 字符编码过滤器:
import javax.servlet.*;
import java.io.IOException;
@WebFilter("/*")
public class EncodingFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
public void init(FilterConfig config) {}
public void destroy() {}
}
- JSP 页面(test.jsp):
<%@ page contentType="text/html;charset=UTF-8" %>
<%
String input = request.getParameter("input");
out.println("输入内容: " + input);
%>
参考资料
- Oracle 官方文档
- javax.servlet.Filter
- 出站链接:https://docs.oracle.com/javaee/7/api/javax/servlet/Filter.html
- 提供 Filter 接口的官方说明。
- JavaTpoint JSP 教程
- JSP Filters
- 出站链接:https://www.javatpoint.com/jsp-filter
- 详细讲解过滤器的实现和配置。
- TutorialsPoint JSP 过滤器
- JSP – Filters
- 出站链接:https://www.tutorialspoint.com/jsp/jsp_filters.htm
- 简洁的过滤器教程和示例。
如果需要更复杂的过滤器示例或有其他问题,请告诉我!
发表回复