Servlet过滤器

本文介绍Servlet过滤器的基本概念、特点及API使用,并通过一个登录认证过滤器实例展示其工作流程。用户未登录时无法访问受保护资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Servlet过滤器简介

  Servlet过滤器是在Servlet规范2.3定义的,它能够对Servlet容器请求资源和响应对象进行检查和修改。Servlet过滤器不产生请求和响应对象,只是提供过滤作用。Servlet过滤器能够在Servlet被调用之前检查Request对象,在Servlet被调用之后检查Response对象。Servlet过滤器负责过滤的Web组件可以是Servlet、JSP或者HTML文件。


二、Servlet过滤器特点

1、检查和修改ServletRequest对象与ServletResponse对象;

2、Servlet过滤器可以被指定和特定的URL关联,只有当客户请求访问该URL时,才会触发过滤器。

3、Servlet过滤器可以被串联在一起,形成管道效应,协同修改请求和响应对象。


三、Servlet过滤器API

  创建Servlet过滤器必须实现javax.servlet.Filter接口,在这个接口当中分定义了init()、doFilter()、destroy()这3个过滤器类必须实现的方法。如下:

1、init()是过滤器初始化方法,可读取web.xml文件中Servlet过滤器初始化参数,Servlet容器创建Servlet过滤器实例后调用该方法,该方法在在Servlet过滤器生命周期调用一次;

public void init(FilterConfig config) throws ServletException {
    //通过config.getInitParameter("")可读取web.xml文件中初始化值	
}
2、doFilter()完成过滤的实际操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法;
public void doFilter(ServletRequest request, ServletResponse response,
	       FilterChain chain) throws IOException, ServletException {
		
    chain.doFilter(request, response);//把处理发送到下一个过滤器,形成管道效应

}

3、destroy()方法在Servlet容器销毁实例前调用该方法,该方法释放过滤器占用的资源,在该方法在在Servlet过滤器生命周期调用一次;

public void destroy() {

}


四、Servlet过滤器实现登录认证过滤实例

 该例主要对用户登录进行认证,如用户没有登录则不能访问web资源,

1、创建登录界面login.jsp,当点击登录时,会将此请求交给Servlet中的doPsot()方法去处理;

<form action="regUserServlet" method="post">
    <table align="center">
	<tr align="center">
		<td colspan="2">用户登录</td>
	</tr>
	<tr>
		<td>帐号:</td>
		<td><input type="text" name="username" /></td>
	</tr>
	<tr>
		<td>密码:</td>
		<td><input type="text" name="password" /></td>
	</tr>
	<tr align="center">
		<td colspan="2"><input type="submit" value="登录" /></td>
	</tr>
      </table>
</form>
2、创建regUserServlet,处理request请求,当帐号与密码输入正确时,跳转到alluser.jsp;

public class regUserServlet extends HttpServlet {

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		//获取帐号与密码
		String username =new String(request.getParameter("username").getBytes("ISO-8859-1"),"utf-8");
		String password = request.getParameter("password");
		
		//request.setAttribute("username", username);
		
		//将获取的账号与密码保存到session中,该会话时间默认是30分钟
		HttpSession session = request.getSession();
		session.setAttribute("username", username);
		session.setAttribute("password", password);

		//判断用户登录
		if (username.equals("etccbw") && password.equals("123456")) {
			request.getRequestDispatcher("/alluser.jsp").forward(request,response);
		} else {
			request.setAttribute("msg","帐号密码输入错误,请重新登录..");
			request.getRequestDispatcher("/error.jsp").forward(request,response);
		}

	}
}
3、创建alluser.jsp,显示用户登录信息;

<body>
      ${username},先生, hello!欢迎您进入本系统...<br>
</body>

4、创建regUserFilter过滤器,主要对用户登录进行验证,我这里主要是将regUserServlet类中保存在Session中的用户信息取出进行判断,个人建议,如果测试时,用request对象进行保存,这样不登录直接访问alluser.jsp资源,则Servlet过滤器效果明显些,直接跳转到logn.jsp页面,如果用Session保存数据,验证Servlet过滤器需要清楚缓存;

public class regUserFilter implements Filter {
	
  public void init(FilterConfig config) throws ServletException {

	String encoding = config.getInitParameter("encoding");
	System.out.println("** 过滤器初始化,初始化参数=" + encoding);
		
  }

  // 编码过滤、登录验证
  public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {

	System.out.println("** 执行过滤器..  **");

	HttpServletRequest req = (HttpServletRequest) request;
	HttpSession session = req.getSession();
	String uname = (String) session.getAttribute("username");
	// 判断如果没有取到用户信息,就跳转到登陆页面
	if (uname == null || "".equals(uname)) {
		request.getRequestDispatcher("/login.jsp").forward(request,response);
		return;//返回
	} else {
		chain.doFilter(request, response);
	}

  }

  public void destroy() {
	System.out.println("** 过滤器销毁..  **");
  }

}
5、配置web.xml

<welcome-file-list>
     <welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<!-- Servlet过滤器配置 	-->
<filter>
   <filter-name>regUserFilter</filter-name>
   <filter-class>com.casv.filter.regUserFilter</filter-class>
   <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
   </init-param>
</filter>
<filter-mapping>
     <filter-name>regUserFilter</filter-name>
     <url-pattern>alluser.jsp</url-pattern>//过滤登录后显示的alluser.jsp资源
</filter-mapping>

<!-- Servlet配置 -->
<servlet>
     <servlet-name>regUserServlet</servlet-name>
     <servlet-class>com.casv.servlet.regUserServlet</servlet-class>
</servlet>
<servlet-mapping>
     <servlet-name>regUserServlet</servlet-name>
     <url-pattern>/regUserServlet</url-pattern>
</servlet-mapping>

6、运行效果:

当用户不进行登录,直接访问资源http://localhsot:8888/servlet_filter_001/alluser.jsp,直接跳转到login.jsp登录页面


打印效果:




 


### Servlet 过滤器的配置及使用方法 #### 1. 创建过滤器过滤器类需要实现 `javax.servlet.Filter` 接口,并重写其三个核心方法:`init`、`doFilter` `destroy`。 - **`init` 方法**:在服务器启动时被调用,主要用于加载配置文件或初始化资源[^1]。 - **`doFilter` 方法**:这是过滤器的核心部分,用于拦截并处理请求响应对象。可以在这里添加自定义逻辑,比如编码设置、权限验证等[^1]。 - **`destroy` 方法**:当服务器关闭时被调用,用于释放过滤器所占有的资源[^1]。 以下是一个简单的过滤器类示例: ```java import javax.servlet.*; import java.io.IOException; public class ExampleFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作,例如读取配置参数 String param = filterConfig.getInitParameter("exampleParam"); System.out.println("初始化参数:" + param); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 在这里可以对请求进行预处理 System.out.println("请求前的操作"); // 继续传递给下一个过滤器或目标资源 chain.doFilter(request, response); // 在这里可以对响应进行后处理 System.out.println("响应后的操作"); } public void destroy() { // 清理工作 System.out.println("销毁过滤器"); } } ``` --- #### 2. 配置过滤器 可以通过两种方式来配置过滤器:基于 XML 的配置基于注解的配置。 ##### (1) 基于 XML 的配置 通过 `web.xml` 文件中的 `<filter>` `<filter-mapping>` 标签完成过滤器的注册映射。 - **<filter> 标签**:定义过滤器的名称及其对应的类名。 - **<filter-mapping> 标签**:指定哪些 URL 请求会被该过滤器拦截。 示例配置如下: ```xml <filter> <filter-name>ExampleFilter</filter-name> <filter-class>com.example.ExampleFilter</filter-class> <!-- 可选:定义初始化参数 --> <init-param> <param-name>exampleParam</param-name> <param-value>value</param-value> </init-param> </filter> <filter-mapping> <filter-name>ExampleFilter</filter-name> <url-pattern>/secure/*</url-pattern> </filter-mapping> ``` 在这个例子中,所有匹配 `/secure/` 路径的请求都会经过 `ExampleFilter` 处理[^4]。 ##### (2) 基于注解的配置 如果使用的 Servlet 容器支持 Servlet 3.0 或更高版本,则可以直接使用 `@WebFilter` 注解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值