过滤器

介绍

​ Filter 即为过滤,用于在 Servlet 之外对 Request 或者 Response 进行修改。它主要用于对用户请求进行预处理,也可以对 HttpServletResponse 进行后处理。使用 Filter 的完整流程: Filter 对用户请求进行预处理,接着将请求交给 Servlet 进行处理并生成响应,最后 Filter 再 对服务器响应进行后处理。在一个 web 应用中,可以开发编写多个 Filter,这些 Filter 组合 起来称之为一个 Filter 链。

单个过滤器


多个过滤器

​ 若是一个过滤器链:先配置先执行(请求时的执行顺序);响应时: 以相反的顺序执行。

​ 在 HttpServletRequest 到达 Servlet 之前,拦截客户的 HttpServletRequest 。根据需要检查HttpServletRequest,也可以修改 HttpServletRequest 头和数据。

​ 在HttpServletResponse 到达客户端之前,拦截 HttpServletResponse。根据需要检查 HttpServletResponse,也可以修改 HttpServletResponse头和数据。

实现

​ 可以通过实现一个叫做javax.servlet.Fileter的接口来实现一个过滤器,其中定义了 三个方法,init(), doFilter(), destroy()分别在相应的时机执行。后期观察生命周期。

​ Filter 的实现只需要两步:

​ Step1: 编写 java 类实现 Filter 接口,并实现其 doFilter 方法。

​ Step2: 通过@WebFilter注解设置它所能拦截的资源。

@WebFilter("/*")
public class Filter01 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {}@Overridepublic void destroy() {}
}

​ Filter 接口中有一个 doFilter 方法,当开发人员编写好 Filter,并配置对哪个 web 资源进行拦截后,Web 服务器每次在调用 web 资源的 service 方法之前,都会先调用一下 filter 的 doFilter 方法。因此可以达到如下效果:

​ 调用目标资源之前,让一段代码执行。

​ 是否调用目标资源(即是否让用户访问 web 资源)。

​ web 服务器在调用 doFilter 方法时,会传递一个 filterChain 对象进来,filterChain 对象是 filter 接口中最重要的一个对象,它提供了一个 doFilter 方法,开发人员可以根据需求决定 是否调用此方法,调用该方法,则 web 服务器就会调用 web 资源的 service 方法,即 web 资源就会被访问,否则 web 资源不会被访问。(本质是放行,调用doFilter方法后,即请求可以到达资源)

实例

请求乱码处理

/*** 字符乱码处理*     乱码情况:Tomcat8及以上版本                            Tomcat7及以下版本POST请求      乱码,需要处理                              乱码,需要处理request.setCharacterEncoding("UTF-8");          GET请求不会乱码,不需要处理                          乱码,需要处理new String(request.getParameter("参数名").getBytes("ISO-8859-1"),"UTF-8");如何处理:1、处理POST请求request.setCharacterEncoding("UTF-8");2、处理GET请求且服务器版本在Tomcat8以下的1> 得到请求类型 (GET请求)2> 得到服务器的版本的信息3> 判断是GET请求且Tomcat版本小于84> 处理乱码new String(request.getParameter("参数名").getBytes("ISO-8859-1"),"UTF-8");*/
@WebFilter("/*")
public class AEncodingFilter implements Filter {public AEncodingFilter() {}public void destroy() {      }public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException {// 基于HTTPHttpServletRequest request = (HttpServletRequest) arg0;HttpServletResponse response = (HttpServletResponse) arg1;// 处理请求乱码乱码 (处理POST请求)request.setCharacterEncoding("UTF-8");  // 处理GET请求且服务器版本在Tomcat8以下的String method = request.getMethod();// 如果是GET请求if ("GET".equalsIgnoreCase(method)) {// 服务器版本在Tomcat8以下的 Apache Tomcat/8.0.45String serverInfo = request.getServletContext().getServerInfo();             // 得到具体的版本号String versionStr = serverInfo.substring(serverInfo.indexOf("/")+1, serverInfo.indexOf("."));// 判断服务器版本是否小于8if (Integer.parseInt(versionStr) < 8) {// 得到自定义内部类  (MyWapper继承了HttpServletRequestWapper对象,而HttpServletRequestWapper对象实现了HttpServletRequest接口,所以MyWapper的本质也是request对象)HttpServletRequest myRequest = new MyWapper(request);// 放行资源chain.doFilter(myRequest, response);return;}}// 放行资源chain.doFilter(request, response);      }public void init(FilterConfig fConfig) throws ServletException {}/*** 定义内部类,继承HttpServletRequestWrapper包装类对象,重写getParameter()方法*/class MyWapper extends HttpServletRequestWrapper {// 定义成员变量,提升构造器 中的request对象的范围private HttpServletRequest request;public MyWapper(HttpServletRequest request) {super(request);this.request = request;}/*** 重写getParameter()方法*/@Overridepublic String getParameter(String name) {String value = request.getParameter(name);if (value != null && !"".equals(value.trim())) {try {// 将默认ISO-8859-1编码的字符转换成UTF-8value = new String(value.getBytes("ISO-8859-1"),"UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}}return value;}}
}

用户非法访问拦截

/*** 非法访问拦截(当用户未登录时,拦截请求到登录页面)*         拦截的资源:*          拦截所有资源  /**         需要被放行的资源:*           不需要登录即可访问的资源*           1、放行指定页面,不需要登录可以访问的页面 (例如:登录页面、注册页面等)*          2、放行静态资源(例如:css、js、image等资源)*          3、放行指定操作,不需要登录即可执行的操作(例如:登录操作、注册操作等)*           4、登录状态放行 (如果存在指定sessuin对象,则为登录状态)*/
@WebFilter("/*")
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException {// 基于HTTPHttpServletRequest request = (HttpServletRequest) arg0;HttpServletResponse response = (HttpServletResponse) arg1;// 得到请求的路径String path = request.getRequestURI(); //   站点名/资源路径    // 1、放行指定页面,不需要登录可以访问的页面 (例如:登录页面、注册页面等)if (path.contains("/login.jsp") || path.contains("/register.jsp")) {chain.doFilter(request, response);return;}// 2、放行静态资源(例如:css、js、image等资源)if (path.contains("/js")) {chain.doFilter(request, response);return;}// 3、放行指定操作,不需要登录即可执行的操作(例如:登录操作、注册操作等)if (path.contains("/loginServlet")) {chain.doFilter(request, response);return;}// 4、登录状态放行 (如果存在指定sessuin对象,则为登录状态)// 得到session域对象String uname = (String) request.getSession().getAttribute("user");// 如果session域对象不为空,则为登录状态,放行资源if (uname != null && !"".equals(uname.trim())) {chain.doFilter(request, response);return;} // 若以上条件均不满足,拦截跳转到登录页面response.sendRedirect("login.jsp");return;}

想要更多Java,前端,大数据,微服务等资料点我扫码领取

servlet过滤器有什么作用,一般用在什么地方??_乐字节java相关推荐

  1. path环境变量的作用与配置-乐字节Java

    1. path环境变量的作用 保证javac命令可以在任意目录下运行. 2. path配置的两种方案: 方法 一如下: ①点击计算机->右键->属性 ②高级系统设置 ③高级->环境变 ...

  2. servlet和jsp页面过滤器Filter的作用及配置

    刚刚有个朋友问我,Servlet的过滤器有什么作用? 现在发个帖子说明一下,            过滤器是一个对象,可以传输请求或修改响应.它可以在请求到达Servlet/JSP之前对其进行预处理, ...

  3. javaweb:servlet过滤器

    servlet过滤器能够对Servlet容器的请求和响应对象进行检查和修改. Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用. Servlet过滤器能够在Servlet被调用之前检查 ...

  4. Java Servlet 过滤器与 springmvc 拦截器的区别?

    前言:在工作中,遇到需要记录日志的情况,不知道该选择过滤器还是拦截器,故总结了一下. servlet 过滤器 定义 java过滤器能够对目标资源的请求和响应进行截取.过滤器的工作方式分为四种 应用场景 ...

  5. java 该改变request url_如何在Java中使用servlet过滤器来更改传入的servlet请求URL?...

    如何使用servlet过滤器来更改传入的servlet请求URL web.xml 至 web.xml ? 更新:根据BalusC的以下步骤,我想出了以下代码: public class UrlRewr ...

  6. Servlet过滤器Filter和监听器

    一.Servlet过滤器的概念: *********************************************************************************** ...

  7. java servlet过滤器简解及实例

    在整个概念中,个人觉得有一篇文章写得不错,通俗易懂,这里就直接套用以上原博文, 一.概念: Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术, ...

  8. jsp/servlet过滤器和struts2拦截器的有什么区别

    jsp/servlet过滤器和struts2拦截器的有什么区别 542430725 | 浏览 3715 次  问题未开放回答  推荐于2016-11-14 01:43:29 最佳答案 过滤器,是在ja ...

  9. Servlet过滤器与SpringMVC拦截器

    Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.Web开发人员通过Filter技术,对web服务器 ...

最新文章

  1. 公式没有编号_知乎公式编辑器的一些小技巧 amp; 使用规范
  2. 如何设置顶部和底部固定,中间填满
  3. android 电话 快捷键,Android studio开发常用快捷键详解
  4. BDD 与DSL 入门
  5. php transfer-encoding: chunked,php – 使用chunked transfer encoding和gzip
  6. 【华为云技术分享】原来CTR预估模型的发展有这样的规律
  7. 数据结构中为什么输入数据还没输入完全就结束了_我岂能忍!面试官居然用数据结构和算法“羞辱”我...
  8. 重新一步一步学习Lucene.NET 一个简单的程序开始(1)
  9. fatal error LINK1123:failure during conversion to COFF:file invalid or corrupt
  10. 项目经理的这几个常用套路,你一定要知道!
  11. atitit.导出excel的设计----查询结果 导出为excel的实现java .net php 总结
  12. hwclock设置日期_hwclock显示系统硬件时钟的日期和时间
  13. 如何编辑修改PDF文字
  14. 鹿晗关晓彤公开恋情,是如何把微博服务器搞炸的? 附大型网站高可用架构和解决方案...
  15. uni-app使用ucharts地图(主要微信小程序-初步使用)
  16. 群晖linux文件夹颜色红色,技术干货分享 | 群晖备份Linux文件夹~
  17. jenkins windows 20008 R2 msi 工作目录迁移
  18. 【写博客常用】x86,x64,arm都是什么
  19. oracle 雪峰,讨论 - 廖雪峰的官方网站
  20. 使用mclust进行聚类分析

热门文章

  1. 无参考图像的清晰度评价方法 (图像清晰度的评价指标)
  2. webstorm 自定义快捷键
  3. seo附加篇-搜索引擎优化
  4. 领导的决策力提升:抓大放小而果断决策
  5. message from server: “Host ‘dsy‘ is not allowed to connect to this MySQL server“
  6. Lwip中实现DM9000/DM9003驱动之一
  7. 2021-01-18课堂检测二
  8. unity安卓平台多摄像机显示黑屏问题
  9. 用户端实现 DDR3 SDRAM 写、读控制
  10. 微信小程序云数据库+云函数