过滤器接口

本文介绍了Java中的过滤器接口,详细讲解了Filter的用途,包括检查请求合法性、增强请求操作。通过实例展示了如何在不修改Servlet代码的情况下,统一设置请求字符编码。并探讨了过滤器拦截地址的格式。

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


提示:以下是本篇文章正文内容,下面案例可供参考

一、过滤器接口?

1.介绍

  1. 来自于servlet规范下接口,存在于tomcat的 servlet-api jar包中
  2. Filter接口实现类由开发人员负责提供,http服务器不负责提供
  3. Filter接口在http服务器调用资源文件之前,对http服务器进行拦截

2.作用

  1. 拦截http服务器,帮助http服务器检测当前请求的合法性。
  2. 拦截http服务器,对当前请求进行增强操作

3.Filter接口实现类 开发三步骤

  1. 创建一个实现filter接口的java类
  2. 重写filter接口中的 dofilter() 方法
  3. 在web.xml文件中,将过滤器接口实现类注册到http服务器

二、作用举例

1.检查当前请求合法性

1.步骤:
(1)创建一张图片作为要调用的【静态资源文件】放在web文件夹下
开发三步骤:

(2)创建com.bjpowernode.filter.OneFilter类;
(3)重写doFilter();
(4)将过滤器接口实现类注册到http服务器

package com.bjpowernode.filter;

import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
/*通过浏览器url地址传参age检验过滤器接口实现类*/
public class OneFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//1.通过拦截请求对象得到请求包参数信息,从而得到用户来访真实姓名
String age = servletRequest.getParameter("age");
// 2.根据年龄,帮助Http服务器判断本次请求合法性
if (Integer.valueOf(age) < 18) {//合法请求
//将拦截的请求对象和响应对象还给Tomcat,由Tomcat继续调用资源文件
filterChain.doFilter(servletRequest,servletResponse);//放行
}else{
//过滤器代替Http服务器拒绝本次请求
servletResponse.setContentType("text/html;charset=utf-8");
PrintWriter out = servletResponse.getWriter();
out.print("<center><font style='color:red;font-size:30px'>您的访问不合法!</font></center>");
}

}
}
(4)将过滤器接口实现类注册到http服务器
<!--将过滤器类文件 路径 交给Tomcat-->
    <filter>
        <filter-name>oneFilter</filter-name><!--声明变量-->
        <filter-class>com.Alan.filter.OneFilter</filter-class>
        <!--将该类路径存到上面的变量中交给Tomcat-->
    </filter>
    <!--通知Tomcat在调用何种资源文件时需要被当前过滤器拦截-->
    <filter-mapping>
        <filter-name>oneFilter</filter-name>
        <url-pattern>/jaizi.jpg</url-pattern><!--只要Tomcat调用该文件时 被拦截检查-->
    </filter-mapping>

2、此时,运行启动Tomcat后,通过浏览器的url地址【http://localhost:8080/web/jaizi.jpg?age=18】调用图片jaizi.jpg即可

2.过滤器对拦截的请求进行增强操作

1)使用post方式时,参数在请求体中,
服务器接收到请求协议包会派 【请求对象】 对请求体中的二进制数据进行编辑,
【请求对象】默认用ISO-…字符集
当请求体有中文时会得到乱码,需要重设请求对象字符集【request.setCharacterEnconding(utf-8);】

2)当有几百个个servlet时这一行代码
【request.setCharacterEnconding(utf-8);】需要反复调用,

如何不在servlet中重复写这行代码!

  1. 创建index.html–编辑表单、OneServlet
<center>
<form action="/web/one" method="post">
参数<input type="text" name="userName"/>
<input type="submit" value="post方式访问OneServlet">
</form>
public class OneServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//请求体读取请求参数
String userName = request.getParameter("userName");
System.out.println("OneServlet 从请求体得到参数:"+userName);
}

}
  1. 创建OneFilter过滤器

public class OneFilter implements Filter {
//通知拦截的请求对象,使用utf-8对当前请求体信息重新编辑一次
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    servletRequest.setCharacterEncoding("utf-8");//增强操作
   filterChain.doFilter(servletRequest,servletResponse);
	//放行,将请求、响应对象返回给Tomcat


}
}
  1. 注册过滤器
<servlet>
<servlet-name>OneServlet</servlet-name>
<servlet-class>com.Alan.controller.OneServlet</servlet-class>
</servlet>
<servlet>

<servlet-mapping>
<servlet-name>OneServlet</servlet-name>
<url-pattern>/one</url-pattern>
</servlet-mapping>

    <filter>
        <filter-name>oneFilter</filter-name>
        <filter-class>com.Alan.filter.OneFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>oneFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <!--通知tomcatzai在调用所有资源文件之前要调用OneServlet拦截-->
  </filter-mapping>
  1. 此时,运行启动Tomcat后,通过浏览器的页面表单输入汉字并提交,进行验证

三、过滤器拦截地址格式

 <filter-mapping>
        <filter-name>oneFilter</filter-name>
        <url-pattern>/拦截地址</url-pattern>
        <!--通知tomcatzai在调用所有资源文件之前要调用OneServlet拦截-->
  </filter-mapping>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值