文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、过滤器接口?
1.介绍
- 来自于servlet规范下接口,存在于tomcat的 servlet-api jar包中
- Filter接口实现类由开发人员负责提供,http服务器不负责提供
- Filter接口在http服务器调用资源文件之前,对http服务器进行拦截
2.作用
- 拦截http服务器,帮助http服务器检测当前请求的合法性。
- 拦截http服务器,对当前请求进行增强操作。
3.Filter接口实现类 开发三步骤
- 创建一个实现filter接口的java类
- 重写filter接口中的 dofilter() 方法
- 在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中重复写这行代码!
- 创建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);
}
}
- 创建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
}
}
- 注册过滤器
<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>
- 此时,运行启动Tomcat后,通过浏览器的页面表单输入汉字并提交,进行验证
三、过滤器拦截地址格式
<filter-mapping>
<filter-name>oneFilter</filter-name>
<url-pattern>/拦截地址</url-pattern>
<!--通知tomcatzai在调用所有资源文件之前要调用OneServlet拦截-->
</filter-mapping>