关于“Java过滤器Filter详解”的攻略,我将从以下几个方面进行详细讲解:
- 概念与简介
- 过滤器的工作原理
- 过滤器的生命周期
- 过滤器的配置
- 过滤器的示例说明
1. 概念与简介
Filter(过滤器)是 Java Web 中的一个组件,它可以截取客户端发送的请求和服务器接收到的响应,对其进行修改或者添置一些参数,并将其传送给下一个过滤器或目标资源(如 Servlet、JSP)。
过滤器可以用于处理编码解码、权限控制、日志记录、事务管理、性能监控等功能,在 Web 开发中是比较常用的组件。
2. 过滤器的工作原理
过滤器继承了javax.servlet.Filter接口,这个接口定义了三个方法:
- init:初始化过滤器
- doFilter:拦截、处理请求以及响应
- destroy:销毁过滤器
当 Web 容器接收到客户端发送的请求后,会先通过对应的过滤器,如果有多个过滤器,按照顺序依次执行,最后再到达 Web 资源(Servlet、JSP 等)。
当 Web 资源产生响应后,也会先经过对应的过滤器,在按照倒序依次执行,最后再返回给客户端。
3. 过滤器的生命周期
- Web 容器在加载我们的 Web 应用程序(war)时,会根据配置文件中规定的Filter,对配置的 Filter 类进行加载,并调用其 init 方法
- 当有请求发送来时,通过 doFilter 方法执行过滤操作
- Web 容器在卸载 Web 应用程序(war)时,会调用 destroy 方法,销毁所有的 Filter 对象
4. 过滤器的配置
Web.xml 中定义的如下节点:
<filter>
<filter-name>Filter名称</filter-name>
<filter-class>Filter全类名</filter-class>
<init-param>
<param-name>初始化参数名称</param-name>
<param-value>初始化参数值</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Filter名称</filter-name>
<url-pattern>匹配的URL</url-pattern>
</filter-mapping>
5. 过滤器的示例说明
现在我们来看一个简单的过滤器示例,假设我们需要在用户访问网站时,对其进行权限验证,只有用户登录且权限符合时,才能访问。
public class AuthFilter implements Filter{
private FilterConfig cfg;
@Override
public void init(FilterConfig cfg) throws ServletException {
this.cfg = cfg;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
HttpSession session = req.getSession(false);
if(session == null || session.getAttribute("user") == null){
res.sendRedirect("/login");
return;
}
String url = req.getRequestURI().substring(req.getContextPath().length());
if(url.startsWith("/admin") && !session.getAttribute("admin").equals(true)){
res.sendRedirect("/unauthorized");
return;
}
chain.doFilter(request, response);
}
@Override
public void destroy() {
this.cfg = null;
}
}
在这个过滤器中,我们定义了一个 AuthFilter 类,并实现了 Filter 接口的三个方法,其中 doFilter 是最重要的方法。
在 doFilter 方法中,我们首先获取 HttpServletRequest 和 HttpServletResponse 对象,然后根据 HttpServletRequest 获取 HttpSession 对象。接下来,判断用户是否登录,如果没有登录,就重定向到登录页面;如果已经登录,再判断其是否有权限访问该页面,如果没有权限,就重定向到未授权页面;最后,调用 filterChain 的 doFilter 方法,将请求和响应传递给下一个过滤器或者目标 Servlet。
接下来,我们再来一个示例,我们需要在所有请求的头部(Header)中,添加一个固定的 Token 用于验证请求的合法性。根据前面的介绍,我们知道过滤器可以在请求被响应之前截获,并对请求进行修改。因此,这个任务可以很轻松地通过添加一个过滤器来实现。
public class AuthTokenFilter implements Filter{
private FilterConfig cfg;
private String token = "MY_AUTH_WIDGET_TOKEN_";
@Override
public void init(FilterConfig cfg) throws ServletException {
this.cfg = cfg;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
res.setHeader("auth-token", token + System.currentTimeMillis());
chain.doFilter(request, response);
}
@Override
public void destroy() {
this.cfg = null;
}
}
在这个过滤器中,我们首先获取 HttpServletRequest 和 HttpServletResponse 对象,并在 Response 的 Header 中添加一个 auth-token,值为一个固定的字符串加上当前的时间戳。最后,调用 filterChain 的 doFilter 方法,将请求和响应传递给下一个过滤器或者目标 Servlet。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java过滤器Filter详解 - Python技术站