精华内容
下载资源
问答
  • 「filterchain」java 过滤器Filter中chain.doFilter()之前和之后代码的执行顺序 - seo实验室
    2021-03-16 00:05:28

    filterchain

    过滤器拦截到请求之后,首先是执行doFilter()方法中chain.doFilter()之前的代码,然后放弃权限给下一个过滤器或者serverlet等等,最后才执行chain.doFilter()之后的代码。

    测试场景:

    1.新建一个index.html,配置连接调整到一个test.jsp页面

    2.对test.jsp做两层过滤,查看过滤器代码中chain.doFilter()之前和之后代码的执行顺序。

    过滤器一:(使用注解控制过滤器执行顺序,此处先执行过滤器一,在执行过滤器2)

    @WebFilter(filterName="firstFilter0",urlPatterns="/test.jsp")

    public class FirstFilter implements Filter {

    @Override

    public void destroy() {

    System.out.println("first destroy...");

    }

    @Override

    public void doFilter(Servletrequest arg0, Servletresponse arg1, FilterChain arg2)

    throws IOException, ServletException {

    System.out.println("1. first doFilter...");

    arg2.doFilter(arg0, arg1);

    System.out.println("2. first doFilter...");

    }

    @Override

    public void init(filterconfig arg0) throws ServletException {

    System.out.println("first init...");

    }

    }

    过滤器二:

    @WebFilter(filterName="firstFilter1",urlPatterns="/test.jsp")

    public class SecondFilter implements Filter {

    @Override

    public void destroy() {

    System.out.println("second destroy...");

    }

    @Override

    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)

    throws IOException, ServletException {

    System.out.println("3. second doFilter...");

    arg2.doFilter(arg0, arg1);

    System.out.println("4. second doFilter...");

    }

    @Override

    public void init(FilterConfig arg0) throws ServletException {

    System.out.println("second init...");

    }

    }

    index.html:

    Insert title here

    To Test Page

    test.jsp:

    pageEncoding="UTF-8"%>

    Insert title here

    Test Page

    System.out.println("5. Test Page");

    %>

    在浏览器输入http://localhost:8080/day_38/index.html控制台将打印如下内容 :

    1. first doFilter...

    3. second doFilter...

    5. Test Page

    4. second doFilter...

    2. first doFilter...

    相关阅读

    http://www.ilovematlab.cn/thread-293710-1-1.html

    -------------------------------------conv2函数-------------------------

    源代码加图片加背景音乐链接:https://pan.baidu.com/s/1Ll_vVsBC-lYNpLrSRAz5ew提取码:h2ds复制这段内容后打开百度网盘手机App,操作

    参考:CRC校验原理及步骤https://blog.csdn.net/d_leo/article/details/73572373

    什么是CRC校验?

    CRC即循环冗余校验码:是数据通信领

    今日团购: 限时活动,机会难得!如此优惠,机不可失,把握好机会哦!

    一、逗号, 之后加空格

    printf(" error! score[%d] = %d\n", i, score[i]);

    二、分号; 之后加空格

    for(i = 0; i < student_n

    更多相关内容
  • Filter中chain.doFilter(req, res)的理解

    千次阅读 2020-04-23 18:26:44
    在写代码中,每次看到Filter(过滤器)中 chain.doFilter(req, res);都不懂为什么要加这一句,他的作用是什么;代码下面也有: @Override public void doFilter(ServletRequest request, ServletResponse response, ...

    在写代码中,每次看到Filter(过滤器)中 chain.doFilter(req, res);都不懂为什么要加这一句,他的作用是什么;代码下面也有:

    @Override
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    		ContentCachingRequestWrapper  req=new ContentCachingRequestWrapper((HttpServletRequest) request);
    		ContentCachingResponseWrapper res=new ContentCachingResponseWrapper((HttpServletResponse) response);
    		long startTime = System.currentTimeMillis();
    		String serverUrl = req.getServletPath();
    		//不懂这句什么意思
    		
    		chain.doFilter(req, res);
    		
    		long endTime = System.currentTimeMillis();
    		try {
    			int status = res.getStatus();
    			String charset=res.getCharacterEncoding();
    			//响应体
    			String responsePayload = getPayLoad(res.getContentAsByteArray(),res.getCharacterEncoding());
    			res.copyBodyToResponse();
    			if(writeLogService==null) {
    				writeLogService = (WriteLogService) ServiceLocator.getInstance().getCtx().getBean("writeLogServiceImpl");
    			}	
    	writeLogService.writeLog(startTime,endTime,serverUrl,postparams,status,responsePayload,charset);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    

    作用

    • 在doFilter()方法中,在chain.doFilter()之前的代码,一般是对request执行的过滤操作;
    • 在chain.doFilter()后面的代码,一般是对response执行的操作;
    • chain.doFiter()执行下一个过滤器或者业务处理器。
    • 如果在doFilter()方法中,不写chain.doFilter(),业务无法继续往下处理;
    展开全文
  • 过滤器拦截到响应url的请求后会先执行doFilter()方法中chain.doFilter()之前的代码,然后执行下一个过滤器或者servelt。紧接着执行chain.doFilter()之后的代码。一下为两个过滤器的执行顺序:过滤器一:packagecom....

    过滤器拦截到响应url的请求后会先执行doFilter()方法中chain.doFilter()之前的代码,然后执行下一个过滤器或者servelt。紧接着执行chain.doFilter()之后的代码。

    一下为两个过滤器的执行顺序:

    过滤器一:

    packagecom.rskd_yswb.lib.filter;import javax.servlet.*;importjava.io.IOException;

    public class HttpRequestAndResponseFilter implementsFilter {privateFilterConfig filterConfig;public voiddestroy() {

    }public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throwsServletException, IOException {

    resp.setCharacterEncoding(this.filterConfig.getInitParameter("encoding"));

    System.out.println("HttpRequestAndResponseFilterBefore");

    chain.doFilter(req, resp);

    System.out.println("HttpRequestAndResponseFilterAfter");

    }public void init(FilterConfig config) throwsServletException {this.filterConfig =config;

    }

    }

    过滤器二:

    packagecom.rskd_yswb.lib.filter;import javax.servlet.*;importjava.io.IOException;public class Test2Filter implementsFilter {public voiddestroy() {

    }public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throwsServletException, IOException {

    System.out.println("Test2FilterBefore");

    chain.doFilter(req, resp);

    System.out.println("Test2FilterAfter");

    }public void init(FilterConfig config) throwsServletException {

    }

    }

    要执行的servlet:

    packagecom.rskd_yswb.servelt;importcom.rskd_yswb.javabean.db.ConsumerEntity;importcom.rskd_yswb.lib.db.DBConnection;importcom.rskd_yswb.lib.db.GenerateSqlStatement;importcom.rskd_yswb.lib.freemarker.FreeMarker;importfreemarker.template.Template;importfreemarker.template.TemplateException;importorg.apache.commons.dbutils.QueryRunner;importorg.apache.commons.dbutils.handlers.BeanMapHandler;importorg.apache.logging.log4j.LogManager;importorg.apache.logging.log4j.Logger;importjavax.servlet.annotation.WebServlet;importjava.io.IOException;importjava.io.Writer;importjava.sql.Connection;importjava.util.HashMap;importjava.util.Map;public class IndexServlet extendsjavax.servlet.http.HttpServlet {private static Logger logger = LogManager.getLogger(IndexServlet.class);protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throwsjavax.servlet.ServletException, IOException {

    doGet(request, response);

    }protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throwsjavax.servlet.ServletException, IOException {

    String sql= new GenerateSqlStatement().select("*").from("consumer").get();try{

    Map consumer = new QueryRunner().query(DBConnection.getConnection(), sql, new BeanMapHandler(ConsumerEntity.class, "username"));

    }catch(Exception e) {

    logger.debug("IndexServlet Error:" +e.getMessage());

    }

    Map root = new HashMap();try{

    FreeMarker.getFreemarker().getTemplate("index.ftl").process(root, response.getWriter());

    System.out.println("请求处理中");

    }catch(TemplateException e) {

    logger.debug("IndexServlet Error:" +e.getMessage());

    }

    }

    }

    web.xml配置内容如下:

    HttpRequestAndResponseFilter

    com.rskd_yswb.lib.filter.HttpRequestAndResponseFilter

    encoding

    utf8

    Test2Filter

    com.rskd_yswb.lib.filter.Test2Filter

    HttpRequestAndResponseFilter

    /*

    Test2Filter

    /*

    IndexServlet

    com.rskd_yswb.servelt.IndexServlet

    IndexServlet

    /index

    IndexServlet

    filter的执行顺序如同web.xml中的配置的顺序,在浏览器输入http://localhost:8080/index 控制台将打印如下内容:

    HttpRequestAndResponseFilterBefore

    Test2FilterBefore

    请求处理中

    Test2FilterAfter

    HttpRequestAndResponseFilterAfter

    展开全文
  • Tomcat中的filter调用doFilter的问题

    千次阅读 2020-11-08 15:32:21
    2.filter中为什么一定要调用chain.doFilter,不调用的话,好像请求就被截断了? 3.我如果在chain.doFilter下面还添加一些语句会发生什么呢? 刚刚学了责任链模式,所以看看,拿到tomcat的源码之后,我们可以重点看下这个类...
    public final class ApplicationFilterChain implements FilterChain {
        /**
         * Filters. ApplicationFilterConfig封装了匹配当前请求的所有filter
         *                                 (注意这里并不是所有的filter,匹配的过程是tomcat自己做的)
         *                                 (并且执行完请求后,这个数据的每个元素都会release掉,即置为null)
         */
        private ApplicationFilterConfig[] filters = new ApplicationFilterConfig[0];
    
    
        /**
         * The int which is used to maintain the current position
         * in the filter chain.
         */
        private int pos = 0; // 索引, 当前执行的filter在上面这个数组中的位置
    
    
        /**
         * The int which gives the current number of filters in the chain.
         */
        private int n = 0; // 一共配置的filter的数量
    
    
        /**
         * The servlet instance to be executed by this chain.
         */
        private Servlet servlet = null;
        
        @Override
        public void doFilter(ServletRequest request, ServletResponse response)
            throws IOException, ServletException {
    
            if( Globals.IS_SECURITY_ENABLED ) {
                final ServletRequest req = request;
                final ServletResponse res = response;
                try {
                    java.security.AccessController.doPrivileged(
                        new java.security.PrivilegedExceptionAction<Void>() {
                            @Override
                            public Void run()
                                throws ServletException, IOException {
                                internalDoFilter(req,res);
                                return null;
                            }
                        }
                    );
                } catch( PrivilegedActionException pe) {
                    Exception e = pe.getException();
                    if (e instanceof ServletException)
                        throw (ServletException) e;
                    else if (e instanceof IOException)
                        throw (IOException) e;
                    else if (e instanceof RuntimeException)
                        throw (RuntimeException) e;
                    else
                        throw new ServletException(e.getMessage(), e);
                }
            } else {
                internalDoFilter(request,response); // 调用下面这个方法
            }
        }
    
        private void internalDoFilter(ServletRequest request,
                                      ServletResponse response)
            throws IOException, ServletException {
    
            // Call the next filter if there is one
            // 0 -> 2  ,假设一共有两个Filter
            // 第一轮: pos = 0, n = 2, 做判断 0 < 2, 好,这个时候pos + 1 所以此时pos = 1
            //        假设此时的第一个Filter没有调用chain.doFilter(req,resp)方法,那么会执行下面的return;
            //        就不会执行下面的servlet调用service方法了
            // 假设第一轮中,调用了chain.doFilter,这个,又回到上面这个方法,接着又调用本方法, 注意此时是同一个FilterChain
            //        此时 pos = 1, 所以 1 < 2, 依旧成立, 好,这个时候pos + 1 所以此时pos = 2
            //        假设第二个过滤器如果又没调用chain.doFilter那么filter.doFilter(request, response, this);
            //        这一句又断了,就直接执行return;
            //        就不会执行下面的servlet调用service方法了
            // 第二轮: 假设第二轮调用了,那么又会回到当前的方法2<2不成立, 那么就会执行下面的servlet调用service方法了
            // 其实chain.doFilter可以这样理解,chain把过滤的具体功能交给filter来实现, 而filter做完自己的过滤功能后,
            //    因为已经拿到了chain, 那么就有权决定,是否要把执行权交回给chain, 如果不交回, 那么chain就断了。
            // =========这是责任链模式的另外一种用法========
            // 思考: 假设其中某一个Filter, 它不是在最后一句调用的filterChain.doFilter
            //      那么其实也实现了spring mvc的拦截器一样的功能,等servlet处理完了之后, 
            //      然后逆序调用filter的那句话后面的代码,
            //      特别注意: 这个时候处理完的request和response已经让servlet处理过了, 
            //      所以filter可以继续接着对这个处理完成了的请求中的request和response对象处理
            //      然后再返回给客户端。
            //      假设很多个过滤器, 前面几个都通过了,但是被一个给拦住了,那么也会逆序回调过滤器dofilter代码之后面的代码        
    
            if (pos < n) { //
                ApplicationFilterConfig filterConfig = filters[pos++]; // 根据索引找filter
                try {
                    Filter filter = filterConfig.getFilter(); //  先获取到filter,如果之前创建过,直接返回,如果没有,
                                                              //  那么通过反射创建,并回调初始化方法,然后传个东西给
                                                              //  它。注意这里的filterConfig是
                     										  //  ApplicationFilterConfig。
                    // 下面分析以下ApplicationFilterConfig
                    //     ApplicationFilterChain中组合了配置的Filter,并都封装成了ApplicationFilterConfig数组,
                    //     并且ApplicationFilterConfig中封装了我们配置的filter的所有相关信息,创建filter也是由
                    //     ApplicationFilterConfig这个对象创建的。所以tomcat读取web.xml中的filter时,创建的并不是
                    //     Filter,而是ApplicationFilterConfig,由这个类来对filter的配置信息做一个封装。真正执行的时候
                    //     从ApplicationFilterConfig类中获取filter,如果之前创建过,那么直接返回,如果之前没有创建过,
                    //     那么通过反射创建Filter,创建好后。
                    //     调用Filter的init方法,并且把当前对象this,也就是ApplicationFilterConfig,传进去。因为
                    //     ApplicationFilterConfig还实现了FilterCOnfig接口,它里面还封装了Context,而从Context里面
                    //     由能拿到ServletContext。
                    //     所以filter重写的init方法中的filterConfig实际上就是ApplicationFilterconfig
    
                    
                    if (request.isAsyncSupported() && "false".equalsIgnoreCase(
                            filterConfig.getFilterDef().getAsyncSupported())) {
                        request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR, Boolean.FALSE);
                    }
                    if( Globals.IS_SECURITY_ENABLED ) {
                        final ServletRequest req = request;
                        final ServletResponse res = response;
                        Principal principal =
                            ((HttpServletRequest) req).getUserPrincipal();
    
                        Object[] args = new Object[]{req, res, this};
                        SecurityUtil.doAsPrivilege ("doFilter", filter, classType, args, principal);
                    } else {
                        filter.doFilter(request, response, this);
                    }
                } catch (IOException | ServletException | RuntimeException e) {
                    throw e;
                } catch (Throwable e) {
                    e = ExceptionUtils.unwrapInvocationTargetException(e);
                    ExceptionUtils.handleThrowable(e);
                    throw new ServletException(sm.getString("filterChain.filter"), e);
                }
                return; // 这个return;语句是关键,如果中间的FilterChain断了的话,
                        //            那么会直接到这里来,下面调用servlet的方法也不会执行了
            }
    
            // We fell off the end of the chain -- call the servlet instance
            try {
                if (ApplicationDispatcher.WRAP_SAME_OBJECT) {
                    lastServicedRequest.set(request);
                    lastServicedResponse.set(response);
                }
    
                if (request.isAsyncSupported() && !servletSupportsAsync) {
                    request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR,
                            Boolean.FALSE);
                }
                // Use potentially wrapped request from this point
                if ((request instanceof HttpServletRequest) &&
                        (response instanceof HttpServletResponse) &&
                        Globals.IS_SECURITY_ENABLED ) {
                    final ServletRequest req = request;
                    final ServletResponse res = response;
                    Principal principal =
                        ((HttpServletRequest) req).getUserPrincipal();
                    Object[] args = new Object[]{req, res};
                    SecurityUtil.doAsPrivilege("service",
                                               servlet,
                                               classTypeUsedInService,
                                               args,
                                               principal);
                } else {
                    // 上面的过滤器执行完了,才轮到servlet去处理这个请求
                    //     注意:这里不一定执行完了, 可以看下上面的思考
                    servlet.service(request, response);
                }
            } catch (IOException | ServletException | RuntimeException e) {
                throw e;
            } catch (Throwable e) {
                e = ExceptionUtils.unwrapInvocationTargetException(e);
                ExceptionUtils.handleThrowable(e);
                throw new ServletException(sm.getString("filterChain.servlet"), e);
            } finally {
                if (ApplicationDispatcher.WRAP_SAME_OBJECT) {
                    lastServicedRequest.set(null);
                    lastServicedResponse.set(null);
                }
            }
        }
    }
    
    展开全文
  • XSS攻击 代码演示

    2018-05-13 17:24:17
    网站xss 攻击 代码示例,包括alert弹框,钓鱼网站截取用户cookie信息等;是学习xss的简单示例。可以下载玩玩看看,示例中的钓鱼网站地址为 演示地址,即本资源中的项目地址。xss也是很简单的,可以学习学习
  • Filter如果不写chain.dofilter(request,response) 那么对应的Servlet URL 是不会执行的。 Java代码:   web.xml   转载于:https://my.oschina.net/boonya/blog/3049397
  • 我认为响应在步骤4到达ServletFilter A时就已经提交.一旦响应被提交,即将标头写入客户端,就无法执行需要添加标头的操作.这些操作类似于添加cookie....这是示例代码:public class ResponseBufferFilter...
  • 但是只要有请求来服务器,过滤器会抛出一个NullPointerExceptionFilterChain doFilter中的java.lang.NullPointerException方法java.lang.NullPointerExceptionorg.apache.commons.beanutils.PropertyUtilsBean.getIn...
  • **结果我测试了,原本在response中的内容,经过chain.doFilter(resquest,resp)之后,我自己创建的resp中的charWriter缓冲区也有了,我想问的就是,这doFIilter的作用到底是什么,貌似包含了将response中的内容自动...
  • doFilter过滤器如何使用

    千次阅读 2020-01-18 16:41:56
    doFilter过滤器:发送和接收时自转编码 典型应用: 使用方法: 注解: 生命周期: doFilter过滤器:发送和接收时自转编码 典型应用: 可以在filter中根据条件决定是否调用chain.doFilter(request, response...
  • 请求到达servlet之前,拦截下来做预处理,处理之后便执行chain.doFilter(request, response)这个方法.chain.doFilter将请求转发给过滤器链下一个filter , 如果没有filter那就是你请求的资源
  • 两个过滤器,EncodingFilter负责设置编码,Security...执行的顺序就如下图所示,执行第一个过滤器的chain.doFilter()之前的代码,第二个过滤器的chain.doFilter()之前的代码,请求的资源,第二个过滤器的chain.doFilter
  • 主要介绍了springboot使用filter获取自定义请求头的实例代码代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
  • chain.doFilter(request,response)详解

    千次阅读 2020-06-27 10:09:36
    doFilter方法被容器调用,同时传入分别指向这个请求/响应链中的 Servlet Request、Servlet Response 和 Filter Chain 对象的引用。然后过滤器就有机会处理请求,将处理任务传递给链中的下一个资源(通过调用 Filter ...
  • 在使用struts2 运行项目时 出现null异常 并且 指向所写的过滤器的 dofilter这一行 结果检查debug 发现这些代码都是正确的 没有出现null的,到底哪里错了呢?我开始把这个错误 去我所访问的jsp页面 检查,发现是我...
  • filter过滤器,filterchain的dofilter方法

    万次阅读 2018-06-11 01:58:05
    tomcat责任链设计模式 FilterChain原理解析实现filterchain的dofilter方法里面存在这种机制,把自身接收到的请求request对象和response对象和自身对象即filterchain作为下一个过滤器的dofilter的三个形参传递过去,...
  • 创建好LoginFilter extends HttpFilter类,导入javax....为了代码美观好复用,我就把前两个参数改为了request和response,但是在后来引用getSession()方法时,居然没有提示,于是我就手敲了上去,居然报错了,一开始我
  • 问题:在Servlet的service()方法和Filter的doFilter()方法中,我们可能会用到转发和重定向,那么在转发和重定向的代码执行后,其后续的代码是否还执行呢? 答:会执行。 原因: 重定向只是向response中添加了一条...
  • chain.doFilter()

    2018-03-30 11:19:28
    过滤器的生命周期一般都要经过下面三个阶段: 初始化 当容器第一次加载该过滤器时,...doFilter方法被容器调用,同时传入分别指向这个请求/响应链中的 Servlet Request、Servlet Response 和 Filter Chain 对象的...
  • 1.浏览器向服务器发送消息:request,使用过滤器为所有请求:设置 request.setCharacter...1.1EncodingFilter.java代码 @WebFilter("/*") public class EncodingFilter implements Filter { @Override public vo
  • chain.doFilter(request, response); String headerLocation = httpResponse.getHeader("Location"); String newUrl = "http://baidu.com"; ((HttpServletResponse) response).setHeader("Location", ...
  • doFile可以处理request,当然也可以处理response。...doFilter(ServletRequse request,ServletResponse response,FilterChain chain); 主要是在FilterChain,所有的拦截都在这个过滤链中。 挡在实现d
  • 关于chain.doFilter(request,response) 他的作用是将请求转发给过滤器链上下一个对象。这里的下一个指的是下一个filter,如果没有filter那就是你请求的资源。 一般filter都是一个链,web.xml 里面配置了几个就有几...
  • 当你的项目中有过滤器,就应该有chain.doFilter(request, response);这句语句,过滤器的作用是在到达请求资源之前执行的一段代码,获取request,response对象,把请求对象的数据过滤,也就是在用户的请求到达...
  • 内网代码不方便贴出来。 最终找到了原因。 在一个filter类当中,没有进行 在dofilter 方法里,有多个判断。当所有判断不符合时候,忘记调用 chain.doFilter(req,resp); 导致直接返回空的数据。...
  • web应用程序的过滤器doFilter方法

    千次阅读 2018-04-13 16:10:20
    最近看了看web过滤器,通过了解源代码,有以下发现,首先过滤器是单例模式,但是过滤器链对象FilterChain是多例的,filters的引用指向这些单例过滤器对象,每次请求都创建一个新的过滤器链对象,初始pos代表运行到的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,529
精华内容 19,011
关键字:

dofilter代码

友情链接: Examen-Cupid.rar