请看下面的详细讲解:
Java Servlet 过滤器使用示例
什么是过滤器?
过滤器是用于拦截请求或响应的一种特殊的 Java web 组件,它能够拦截某个请求,进行某些处理(例如:验证、统计等),然后将请求传递给下一个组件或返回响应给客户端。过滤器是一个独立的组件,它可以被任意 web 应用程序重用。
过滤器的工作原理
过滤器在 Servlet 容器中扮演了一个入侵者的角色,当有请求到达 Servlet 容器后,过滤器会把请求拦截下来,对请求进行处理(修改、删除、增加等),处理完并得到响应后,再把请求转发到目标 Servlet 或 JSP 或其他组件中。
过滤器是通过一个 FilterChain 对象来实现工作的,一个 FilterChain 对象包括所有定义在某个应用程序中的过滤器。Servlet 容器把请求传递给 FilterChain,然后由每个过滤器按照定义的顺序对请求进行处理,最后把请求传递给目标 Servlet 或 JSP。
如何使用过滤器
在 Java web 程序中使用过滤器的步骤如下:
-
编写过滤器类并实现 javax.servlet.Filter 接口;
-
在 web.xml 配置文件中定义过滤器并指定拦截的 URL;
-
在 web.xml 配置文件中为需要过滤的 Servlet 指定过滤器。
下面我们通过两个示例来详细讲解如何使用过滤器。
示例一:字符集过滤器
在许多应用程序中,我们希望把所有请求和响应的字符集都设置为 UTF-8,这时我们可以使用字符集过滤器来实现这个目的。
- 编写字符集过滤器类 CharsetFilter
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CharsetFilter implements Filter {
private String encoding;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.encoding = filterConfig.getInitParameter("encoding");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
// 设置请求和响应的字符集
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
// 继续处理请求链
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
- 在 web.xml 配置文件中定义过滤器并指定拦截的 URL
<filter>
<filter-name>CharsetFilter</filter-name>
<filter-class>com.example.filters.CharsetFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetFilter</filter-name>
<url-pattern>/*</url-pattern> <!-- 这里指定拦截全部请求 -->
</filter-mapping>
- 在 web.xml 配置文件中为需要过滤的 Servlet 指定过滤器
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.example.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<filter-mapping>
<filter-name>CharsetFilter</filter-name>
<servlet-name>HelloServlet</servlet-name>
</filter-mapping>
以上配置将字符集过滤器作用在了 /hello 的 Servlet 上,当客户端请求 /hello 页面时,过滤器会拦截请求并把请求和响应的字符集设置为 UTF-8,然后把请求转发给 HelloServlet 处理。
示例二:检查登录状态过滤器
在许多应用程序中,我们希望用户在访问需要登录才能访问的页面时,只有在已经登录的情况下才能访问,这时我们可以使用检查登录状态过滤器来实现这个目的。
- 编写检查登录状态过滤器类 CheckLoginFilter
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CheckLoginFilter implements Filter {
private String loginUrl;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.loginUrl = filterConfig.getInitParameter("loginUrl");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
// 检查用户是否已经登录
boolean isLogin = checkLogin(request);
if (isLogin) {
// 用户已经登录,继续处理请求链
filterChain.doFilter(request, response);
} else {
// 用户未登录,重定向到登录页面
response.sendRedirect(loginUrl);
}
}
@Override
public void destroy() {
}
private boolean checkLogin(HttpServletRequest request) {
// 判断用户是否已经登录
// TODO:根据实际情况编写登录判断逻辑
return false;
}
}
- 在 web.xml 配置文件中定义过滤器并指定拦截的 URL
<filter>
<filter-name>CheckLoginFilter</filter-name>
<filter-class>com.example.filters.CheckLoginFilter</filter-class>
<init-param>
<param-name>loginUrl</param-name>
<param-value>/login</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CheckLoginFilter</filter-name>
<url-pattern>/protected/*</url-pattern> <!-- 这里指定拦截 /protected 目录下的所有请求 -->
</filter-mapping>
- 在 web.xml 配置文件中为需要过滤的 Servlet 指定过滤器
<servlet>
<servlet-name>DisplayUserInfoServlet</servlet-name>
<servlet-class>com.example.DisplayUserInfoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayUserInfoServlet</servlet-name>
<url-pattern>/protected/displayUserInfo</url-pattern>
</servlet-mapping>
<filter-mapping>
<filter-name>CheckLoginFilter</filter-name>
<servlet-name>DisplayUserInfoServlet</servlet-name>
</filter-mapping>
以上配置将检查登录状态过滤器作用在了 /protected/displayUserInfo 的 Servlet 上,当客户端请求 /protected/displayUserInfo 页面时,过滤器会拦截请求并判断用户是否已经登录,如果已经登录,则继续处理请求链;如果未登录,则重定向到 /login 页面。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java servlet过滤器使用示例 - Python技术站