chain.doFilter(req, resp)

web中的Filiter过滤器:

  当req不改变时,filiter在web中的配置和顺序没有关系;

  但当在filiter中将其改变类型时,会导致其改变的request类型包装层次过多,无法获取其中的参数;

  例:http://www.cnblogs.com/springlight/p/6208908.html

  上例中在下面代码中改变了request类型

  MultipartHttpServletRequest multiReq = multipartResolver.resolveMultipart(httpReq);

  而在web.xml中,改变request类型的过滤器之后,还有另一个过滤器,使得request重新包装,多层嵌套其中

  <filter-mapping>
    <filter-name>requestFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>  

   <filter-mapping>
     <filter-name>XssSqlFilter</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>

  这就导致多次的包装

  chain.doFilter(req, resp);

  在controller层就无法按照原有的方式去获取参数值,如下:

        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        if(WebUtil.isEmpty((CommonsMultipartFile) multipartRequest.getFile("file"))){//此处无法获取文件
            json.put("message", "没有文件");
            return json.toString();
        }

  解决方案:

  调转web.xml中过滤器的申明顺序即可,如下:

<filter-mapping>
     <filter-name>XssSqlFilter</filter-name>
     <url-pattern>/*</url-pattern>
   </filter-mapping>
  <filter-mapping>
        <filter-name>requestFilter</filter-name>
         <url-pattern>/*</url-pattern>
  </filter-mapping>

  感想:

  此时得到正确的结果,激动的不能自已。

时间: 2024-08-10 07:40:57

chain.doFilter(req, resp)的相关文章

java 过滤器Filter中chain.doFilter()之前和之后代码的执行顺序

过滤器拦截到响应url的请求后会先执行doFilter()方法中chain.doFilter()之前的代码,然后执行下一个过滤器或者servelt.紧接着执行chain.doFilter()之后的代码. 一下为两个过滤器的执行顺序: 过滤器一: package com.rskd_yswb.lib.filter; import javax.servlet.*; import java.io.IOException; public class HttpRequestAndResponseFilter

过滤器中的chain.doFilter(request,response)

先来说说过滤器filter的作用,它就相当于公路上的一个关卡,对要通过的拦截下来进行相关操作或放行. dofilter作用[request -> filter1 -> filter2 ->filter3 -> .... -> request resource.] 先写一个简单的没有filter的登录例子,当用户名和密码都是admin时,能跳转到success页面,否则到fail页面. 1.eclipse建立一个web project ,结果目录如下 其中,jsp很简单.在lo

chain.doFilter(request,response)含义

过滤器的生命周期一般都要经过下面三个阶段: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用.我们的过滤器实际上并不需要这样做,因为其中没有使用初始化信息,这里只是出于演示的目的. 过滤 过滤器的大多数时间都消耗在这里.doFilter方法被容器调用,同时传入分别指向这个请求/响应链中的 Servlet Request.Servlet Response 和 Filter Chain 对象的引用.然后过滤器就有机

//可以不保存在session中, 并且前面我保存在request,这里session也可以获取 chain.doFilter(request, response); //只有登录名不为空时放行,防止直接登录 成功的页面

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httprequest = (HttpServletRequest)request; HttpServletResponse httpresponse = (HttpServletResponse)res

对chain.doFilter(request,response)的理解

他的作用是将请求转发给过滤器链上下一个对象.这里的“下”指的是哪里 ? 指的是下一个filter,如果没有filter那就是你请求的资源. 一般filter都是一个链,web.xml 里面配置了几个就有几个.一个一个的连在一起 request -> filter1 -> filter2 ->filter3 -> .... -> request resource. 下面举一个例子: input.jsp 是用来提交输入的,当提交后,过滤器检测姓名和年龄,如果整常的话会提交给out

过滤器chain.doFilter(request,response)的含义

过滤器的生命周期一般都要经过下面三个阶段: 初始化: 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用.我们的过滤器实际上并不需要这样做,因为其中没有使用初始化信息,这里只是出于演示的目的. 过滤: 过滤器的大多数时间都消耗在这里.doFilter方法被容器调用, 同时传入分别指向这个请求/响应链中的 Servlet Request.Servlet Response 和 Filter Chain 对象的引用.然后过滤器

Java filter中的chain.doFilter详解

转载: 一.chain.doFilter作用 1.一般filter都是一个链,web.xml 里面配置了几个就有几个.一个一个的连在一起 request -> filter1 -> filter2 ->filter3 -> -. -> request resource. 2.chain.doFilter将请求转发给过滤器链下一个filter , 如果没有filter那就是你请求的资源 二.举例 input.jsp 是用来提交输入的 : 当提交后,过滤器检测姓名和年龄 . 如果

【JavaWeb学习】过滤器Filter

一.简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过Filter技

Java面试题全集(中)

这部分主要是与Java Web和Web Service相关的面试题. 96.阐述Servlet和CGI的区别? 答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet. 补充:Sun Microsystems公司在1996年发布Servlet技术就是为了和CGI进行竞争,Servlet是一个特殊的Java程