saw filter(ND filter)

  Filter是什么意思(本文带你超详细的了解滤波器的原理和应用)。

  什么是过滤器

  1)过滤器的基本功能是拦截Servlet容器调用Servlet (JSP)的过程,从而实现Servlet处理请求之前和Servlet响应请求之后的一些特殊功能。

  2)在Servlet API中定义了三个接口类,供开发人员编写filter程序:Filter、filterchain、filterconfig

  3) Filter程序是实现Filter接口的Java类,类似于Servlet程序,由Servlet容器调用执行

  4)Filter程序需要在web.xml文件中注册,并设置可以拦截的资源:Filter程序可以拦截Jsp、Servlet、静态图片文件、静态html文件

  过滤器的工作原理是什么

  这个Servlet过滤器是我们的过滤器

  1)当在web.xml中注册了一个Filter来拦截一个Servlet程序时,Filter就成了Tomcat和Servlet程序之间通信线路上的一道屏障。过滤器可以拦截Servlet容器向Servlet程序发送的请求和Servlet程序向Servlet容器发回的响应,并决定是否将请求传递给Servlet程序以及是否修改请求和相应的信息。

  2)一个web应用可以注册多个Filter程序,每个Filter程序可以截取一个或一组Servlet程序。

  3)如果多个Filter程序拦截了一个Servlet程序的访问过程,当对该Servlet的访问请求到达时,web容器会将这些多个Filter程序组合成一个Filter链。过滤器链中每个过滤器的拦截顺序与它们在应用程序的web.xml中的映射顺序一致

  过滤器-helloword

  你好-世界

  编写过滤器有三个步骤:

  1.创建一个过滤器实现类来实现过滤器接口

  2.编写一个web.xml配置文件来配置过滤器的信息

  3.运行项目,您可以看到过滤器工作正常

  代码:

  //1。过滤器实现类

  公共类MyFirstFilter实现筛选器{

  @覆盖

  public void init(filter config filter config)引发ServletException {

  System.out.println('初始化方法');

  {}

  @覆盖

  public void doFilter(servlet request请求、ServletResponse响应、FilterChain链)引发

  IOException,ServletException {

  System.out.println('dofilter方法');

  {}

  @覆盖

  public void destroy() {

  System.out.println('销毁方法.');

  {}

  {}

  //2。web.xml配置

  我的过滤器

  com . at guigu . filter . MyFirstFilter

  我的过滤器

  /index.jsp

  //3。运行程序后发现没有显示index.jsp页面,后台输出“dofilter Method”,表示我们写的过滤器已经执行。

  过滤器的生命周期

  1)当服务器启动时,创建并初始化过滤器,并执行init()方法。

  2)当请求通过过滤器时,执行doFilter方法。

  3)当服务器停止时,调用销毁方法。

  过滤释放请求

  我们发现刚才配置了过滤器后,index.jsp页面无法访问,访问该页面时调用了过滤器的dofilter方法。说明dofilter方法截获了我们的请求。

  我们如何显示页面?也就是如何释放请求。我们观察到在这个方法中引入了一个过滤链。filterChain中有一个doFilter()方法。发布请求只需要调用filterChain的dofilter方法。

  public void doFilter(servlet request请求,ServletResponse响应,FilterChain)引发IOException,ServletException {

  System.out.println('dofilter方法');

  chain.doFilter(请求,响应);//发布请求

  {}

  过滤器拦截原理

  我们被锁住了。dofilter(请求、响应);在方法后面写一个字,System.out.println

  (“执行doFilter方法后……”),在index.jsp页面上写一个jsp脚本片段,输出我是一个jsp页面。运行程序发现,控制台输出以下文字:

  Dofilter方法…我是jsp页面

  在dofilter方法之后…

  不难发现过滤器的运行过程

  FilterChain

  doFilter(ServletRequest请求、ServletResponse响应、FilterChain链)

  在执行doFilter之前,筛选器链对象由容器传递到方法中。可以通过调用。这个对象的doFilter()方法,它实际上执行过滤器链中的下一个doFilter方法,但是如果只有一个过滤器,它就会被释放。

  FilterConfig

  FilterConfig类似于ServletConfig,是Filter的配置信息对象。FilterConfig对象有以下方法。

  GetFilterName():获取当前筛选器的名称。获取在web.xml中配置的筛选器名称的值

  Getinitparameter(字符串名称):获取过滤器的初始化参数。在web.xml中配置

  GetIntParameterNames():获取筛选器初始化参数名称的集合。

  GetServletContext():获取当前web项目的ServletContext对象。

  过滤器的网址模式

  url模式配置哪些请求需要筛选器。主要有以下配置:

  在web.xml中配置的/都以当前项目路径为根路径

  1)精确匹配:

  当请求/index.jsp和/user/login时,/index.jsp/user/login将执行过滤方法。

  2)路径匹配:

  /user/* /*路径/user/下的所有请求都将被拦截。/*表示拦截系统的所有请求,包括静态资源文件。

  3)扩展匹配:

  *。jsp *。任何后缀为. jsp.action的请求都会被拦截。

  注意:/login/*。jsp是错误的,只能是上述三种形式中的任何一种。您不能组合新表单。

  *jsp也不对,扩展名匹配必须是后缀。

  4)多网址模式配置

  以上三种形式都有局限性,但是可以配置多个url-pattern,这样这三种组合基本上就可以解决所有问题

  多重过滤器的执行顺序

  如果多个过滤器拦截相同的资源,拦截的顺序与web.xml中配置的顺序一致

  执行流程图如下

  请求总是在处理后返回,以在doFilter后执行方法。

  HttpServletWrapper和HttpServletResponseWrapper

  定义

  Servlet API提供了一个HttpServletRequestWrapper类来包装原始请求对象。HttpServletRequestWrapper类实现了HttpServletRequest接口中的所有方法,这些方法的内部实现只调用一次被包装的请求对象的对应方法。

  //包装器类实现ServletRequest接口。

  公共类ServletRequestWrapper实现ServletRequest {

  //包装的ServletRequest对象

  私有ServletRequest请求;

  //构造函数传入ServletRequest实现类对象

  公共SERVLETrequestwrapper(SERVLETrequest请求){

  if (request==null) {

  引发新的IllegalArgumentException(“请求不能为空”);

  {}

  this.request=request

  {}

  //实现ServletRequest的方法:调用包装成员变量的方法实现。

  公共对象getAttribute(字符串名称){

  返回this . request . GetAttribute(name);

  {}

  公共枚举getAttributeNames() {

  return this . request . getattributenames();

  {}

  //.

  {}

  类似的Servlet API还提供了一个HttpServletResponseWrapper类来包装原始响应对象

  影响

  用于修改或增强HttpServletRequest或HttpServletResponse的方法。

  公共类MyHttpServletRequest扩展了HttpServletRequestWrapper{

  公共my HttpServletrequest(HttpServletrequest请求){

  super(请求);

  {}

  @覆盖

  公共字符串getParameter(字符串名称){

  string val=super . GetParameter(name);

  if(val!=null val.contains('他妈的'){

  val=val.replace('他妈的',' * * * ');

  {}

  返回val

  {}

  {}

  程序员除了写代码,还能怎么挣别的工资?

  使用

  在筛选器中,用我的HttpServletRequest替换传入的HttpServletRequest

  httpersvletrequest=new Myhttpersvletrequest(请求);

  filterChain.doFilter(req,response);

  此时,到达目标servlet或JSP的servlet请求实际上是我的servlet请求

  来源:莫然,欢迎分享这篇文章!

  莫然

匿名

发表评论

匿名网友