1.什么是Filter
过滤器是用于过滤Servlet的请求和响应,过滤器是在客户端和Servlet之间。当客户端请求某一个Servlet
的时候,请求会先进入Filter的doFilter(),开始处理,处理完成以后,调用chain.doFilter(request, response)
把request,response继续传递,让请求继续往下走,进入Servlet,在Servlet处理完成以后,又重回Filter的
doFilter(),执行chain.doFilter(request, response)下面的语句,完成以后,响应给客户端.

**注意:**Filter不会产生request和response对象,只是对request和response的值进行修改,起到一个过滤的
作用
原理图:

2,测试Filter和servlet的生命周期
(1)写一个MyServlet(实现Servlet接口),实现destroy() ,init(),service()和构造方法
(2)写一个MyFilter(实现Filte接口),实现destroy() ,init(),doFilter()和构造方法

public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException{System.out.println("过滤之前");//进到过滤,开始处理,处理完成以后,让请求继续往下走,进入Servletchain.doFilter(request, response);//在Servlet完成以后,又重回过滤器响应给客户端System.out.println("过滤之后");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

(3)web.xml配置

 <servlet><servlet-name>MyServlet</servlet-name><servlet-class>com.accp.servlet.MyServlet</servlet-class></servlet><servlet-mapping><servlet-name>MyServlet</servlet-name><url-pattern>/MyServlet</url-pattern></servlet-mapping><filter><!--过滤器的类  --><filter-name>MyFilter</filter-name><filter-class>com.accp.filter.MyFilter</filter-class>
</filter>
<filter-mapping><filter-name>MyFilter</filter-name><!-- 表示只过滤MyServlet这一个servlet,其他Servlet不管 --><servlet-name>MyServlet</servlet-name><!-- 表示所有的请求都被过滤--><url-pattern>/*</url-pattern>
</filter-mapping>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

**注意:**filter是服务器启动就产生了,并且进行初始化,而servlet一定是有了请求才会出生和初 始化,从打印的结果可以看到请求先进入filter,回去的时候又从过滤器经过. 当服务器重启或者关闭,servlet先死,filter后死
2,Filter应用
(1).解决中文乱码问题(request和response)

 public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest)req;HttpServletResponse response = (HttpServletResponse)res;if(request.getMethod().equalsIgnoreCase("post")){request.setCharacterEncoding("gb18030");}else{Enumeration enum = request.getParameterNames();while(enum.hasMoreElements()){String key = (String)enum.nextElement();String[] values = request.getParameterValues(key);for(int i=0;i<values.length;i++){   values[i]=newString(values[i].getBytes("iso8859-1"),"gb18030");}   }}//必须写在过滤之前,写在之后就会失效response.setContentType("text/html;charset=gb18030");chain.doFilter(request, response);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

(2).解决权限问题

public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest)req;HttpServletResponse response = (HttpServletResponse)resp;//得到session的值String role = (String)request.getSession().getAttribute("role");//拿到项目的路径,相当于"/项目名"System.out.println("-------------"+request.getContextPath());if(role==null || !role.equals("admin")){response.sendRedirect(request.getContextPath()+"/error.jsp");}chain.doFilter(request, response);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

web.xml中配置过滤器

<filter><filter-name>AdminFilter</filter-name><filter-class>com.accp.filter.AdminFilter</filter-class></filter><filter-mapping><filter-name>AdminFilter</filter-name><!-- 注意路径--><url-pattern>/admin/*</url-pattern>
</filter-mapping>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

(3),过滤掉非法文字过滤掉非法文字
a.
准备一个str.properties文件,把要过滤掉的字符,准备在里面
\u738b\u516b=*
\u65e5\u672c=**
\u6740\u624b=*
注意这里要转码
\u738b\u516b–>王八
\u65e5\u672c–>日本
\u6740\u624b–>杀手

b.过滤器代码

Properties ps = null;
public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException,    ServletException {HttpServletRequest request = (HttpServletRequest)req;HttpServletResponse response = (HttpServletResponse)resp;//注意中文乱码的设置request.setCharacterEncoding("gb18030");Enumeration enum =  request.getParameterNames();while(enum.hasMoreElements()){String key = (String)enum.nextElement();String[] values = request.getParameterValues(key);for (int i = 0; i < values.length; i++) {       //根据key,从properties中拿到值,如果不为空,则证明一定有非法字符//然后替换掉if(ps.get(values[i])!=null){values[i] = ps.getProperty(values[i]);}}  }chain.doFilter(request, response);
}
//初始化中读取str.properties文件
public void init(FilterConfig filterConfig) throws ServletException {try {//读取str.properties文件InputStream in = filterConfig.getServletContext().getResourceAsStream("/WEB-INF/str.properties");ps = new Properties();ps.load(in);//加载配置文件in.close();} catch (IOException e) {e.printStackTrace();}}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

4,dispatcher的作用
2.4版本的servlet规范在部属描述符中新增加了一个元素,这个元素有四个可能的值:即REQUEST,FORWARD,INCLUDE和ERROR,可以在一个元素中加入任意数目的,使得filter将会作用于直接从客户端过来的request,通过forward过来的request,通过include过来的request和通过过来的request。如果没有指定任何< dispatcher >元素,默认值是REQUEST。可以通过下面几个例子来辅助理解。

dispacher的配置值中 :默认是:REQUEST

REQUEST:直接从浏览器过来的请求都会过滤过来
FORWARD:通过转发请求指定资源
INCLUDE:通过包含的方式的请求(静态包含不包括)
ERROR:如果请求是通过发起的 就过滤

testFilter.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%//forward:转发:FORWARD会过滤该请求request.getRequestDispatcher("MyServlet").forward(request,response);//ERROR:如果请求是通过<error-page>发起的 就过滤//会跳转到web.xml中error-page的指向的页面System.out.println(10/0);
%>
<!-- jsp指定的转发 -->
<!-- 静态包含: -->
<%@include file="show.jsp"%>--%>
<!-- 动态包含:INCLUDE 通过包含的方式的请求(静态包含不包括) -->
<%--<jsp:include page="show.jsp"></jsp:include>--%>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

web.xml中核心的配置

.....
<filter-mapping>    <filter-name>MyFilter</filter-name><!-- 所有请求的都必须过滤 --><url-pattern>/*</url-pattern><!-- 指定某个请求资源才过滤 --><!--<servlet-name>MyServlet</servlet-name>--><!-- 面试要用的配置:REQUEST FORWARD INCLUDE ERROR默认是:REQUESTREQUEST:所有请求都会过滤过来FORWARD:通过转发请求指定资源INCLUDE:通过包含的方式的请求(静态包含不包括)ERROR:如果请求是通过<error-page>发起的 就过滤--><dispatcher>ERROR</dispatcher></filter-mapping>.....<!--error-page发起的请求--><error-page><error-code>500</error-code><location>/error.jsp</location></error-page><error-page><exception-type>java.lang.Exception</exception-type><location>/error.jsp</location></error-page>

servlet03-过滤器相关推荐

  1. 过滤器的实际应用(编码、敏感词、压缩过滤器)

    文章目录 前言 编码过滤器 开发过滤器 增强request对象 敏感词过滤器 压缩资源过滤器 增强response对象 过滤器 测试 小结 前言 在前一章中已经初步的介绍了过滤器的定义和过滤器的简单使 ...

  2. Redis 预防缓存穿透“神器” — 布隆过滤器

    1. 布隆过滤器 1.1 概念 在架构设计时有一种最常见的设计被称为布隆过滤器,它可以有效减少缓存穿透的情况.其主旨是采用一个很长的二进制数组,通过一系列的 Hash 函数来确定该数据是否存在. 布隆 ...

  3. SpringBoot2.3 修改响应头、添加更新token、解决在过滤器中修改失败

    前言 使用Spring Boot开发项目的过程中,难免会遇到向响应头中写入一些信息,例如更新了的token,用户详情等信息.在请求头中添加,请求时就可以通过过滤器,拦截器等验证或者获得请求头传递的信息 ...

  4. [JAVA EE] Filter过滤器

    Filter过滤器 ◼ 过滤器(Filter)可以动态地拦截请求和响应. ◼ 应用场景:过滤敏感词汇.防止SQL注入.设置字符编码.进行URL级 别的权限访问控制.压缩响应信息等. 启动文件DemoA ...

  5. java 过滤器Filter

    Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件 ...

  6. java 编码过滤器_Java编码过滤器

    Java编码过滤器: package com.utils; import javax.servlet.*; import javax.servlet.http.*; public class Enco ...

  7. android service intent-filter,如何在permission中加入intent-filter过滤器获取NotificationListenerService权限...

    现在要让我的app获取NotificationListenerService权限,我勾选了BIND_NOTIFICATION_LISTENER_SERVICE权限后,用native.js跳到ACTIO ...

  8. authc过滤器 shiro_shrio 权限管理filterChainDefinitions过滤器配置

    /** * Shiro-1.2.2内置的FilterChain * @see ============================================================= ...

  9. Filter(过滤器)

    一.Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作. 1.Filter快速入门 1.1.步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方 ...

  10. 算法:详解布隆过滤器的原理、使用场景和注意事项@知乎.Young Chen

    算法:详解布隆过滤器的原理.使用场景和注意事项@知乎.Young Chen 什么是布隆过滤器 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data struc ...

最新文章

  1. 六大“未来式”存储器,谁将脱颖而出?
  2. inotify java maven_INOTIFY 系列(一) 安装 和初步使用
  3. 珠心算测验(洛谷-P2141)
  4. NSDictionary / NSMutableDictionary 及 NSArray / NSmutableArray (实例)
  5. MCGS 无限配方数据存储及U盘导入导出-第一集
  6. 解决Ubuntu的root账号无法登录SSH问题-Permission denied, please try again.
  7. 妙用git rebase --onto指令
  8. Linux socket等于0,Linux系统环境下的Socket编程详细解析
  9. 【雷达通信】基于matlab雷达数字信号处理【含Matlab源码 281期】
  10. 排序算法lowb三人组-冒泡排序
  11. matlab shading颜色设置,关于matlab中pcolor显示图片时的shading设置问题
  12. macos修改WIFI共享功能的默认网段
  13. 项目十大管理之成本管理
  14. [心情故事]一九九九年的年终工作总结——318冒险日志之初心者の道场
  15. centos7代理使用docker国内镜像
  16. AWS configure region 配置错误了怎么更正
  17. C语言编程之按要求输出,不符合则不输出
  18. Photoshop 批量修改图片尺寸
  19. 抖音、快手最火爆的拍摄技巧,拍出点赞10万+的视频、照片同样可用
  20. 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问。

热门文章

  1. 使用EasyExcel写日期的问题
  2. 系统优化工作——存量模块满意度评估
  3. 恢复磁盘原始空间大小
  4. (20200224已解决)CentOS安装Docker出错No package docker-ce available
  5. Windows平台安装MacOS虚拟机 - VMware(结尾附视频)
  6. 记一次tomcat跑项目遇到的问题
  7. 蚂蚁区块链第20课 可信存证司法链从入门到实施
  8. xray+crawlergo扫描器安装指导
  9. Snap是如何用“苹果战略”突破Facebook封锁的?
  10. 【CE】GTA5版本1.52部分基址