开发者社区> 问答> 正文

关于jfinal处理请求的流程问题? 400 报错

关于jfinal处理请求的流程问题? 400 报错

@JFinal 你好,想跟你请教几个问题:

1,jfinal处理流程中是否在jfianlfilter.dofilter()中就把请求通过handler处理了 如下

boolean[] isHandled = {false};
		try {
			handler.handle(target, request, response, isHandled);
		}
2,如果是这样的话那FilterChain还有什么用途 
if (isHandled[0] == false)
			chain.doFilter(request, response);
3,请求执行完成之后为什么ApplicationFilterChain这个责任链还会继续 明明isHandled[0]已经是ture了通过调试发现chain.doFilter也没有执行 可程序还是往下走了

展开
收起
优选2 2020-06-09 10:58:46 706 0
1 条回答
写回答
取消 提交回答
  • 1:JFinal顶层是一个Handler链条,是责任链模式的一个变种。Handler会拦截到所有请求,包括静态资源请求,如xxx.cs、yyy.js请求

    2:通过JFinalConfig.configHandler(Handlersme)的me.add(newXxxHandler())可以配置自义Handler

    3:自定义Handler可以自行判断决定是否应该处理当前请求。此外Handler如果不去调用nextHandler.handle(...),则本次请求处理到此为止,不会向下传递。最后Handler中可以设置isHandle[0]的值,如果设置为true,则JFinalFilter中不会将此请求传递给下一个Filter(在web.xml中配置的Filter)

    4:Handler链条的末端是ActionHandler,这是专门处理action动态请求的地方,如果当前请求被认定为action动态请求,则isHandle[0]会被立即置为1,即JFinal接管所有action动态请求,JFinalFilter不必传递给下个Filter

    5:isHandle[0]这个值主要用来告诉JFinalFilter是否应该将请求传递给下一个Filter,也可以用于在各个Handler之间利用该信息,做些符合需求的处理,例如某两个Handler约定,前一个Handler如果置isHandle[0]为true了,则后一个Handler就不必处理该请求了

      建议自建一个Handler调试一下,试着改变isHandle[0]的值,看程序执行流程

    ######谢谢解答...######

    引用来自“JFinal”的答案

    1:JFinal顶层是一个Handler链条,是责任链模式的一个变种。Handler会拦截到所有请求,包括静态资源请求,如xxx.cs、yyy.js请求

    2:通过JFinalConfig.configHandler(Handlersme)的me.add(newXxxHandler())可以配置自义Handler

    3:自定义Handler可以自行判断决定是否应该处理当前请求。此外Handler如果不去调用nextHandler.handle(...),则本次请求处理到此为止,不会向下传递。最后Handler中可以设置isHandle[0]的值,如果设置为true,则JFinalFilter中不会将此请求传递给下一个Filter(在web.xml中配置的Filter)

    4:Handler链条的末端是ActionHandler,这是专门处理action动态请求的地方,如果当前请求被认定为action动态请求,则isHandle[0]会被立即置为1,即JFinal接管所有action动态请求,JFinalFilter不必传递给下个Filter

    5:isHandle[0]这个值主要用来告诉JFinalFilter是否应该将请求传递给下一个Filter,也可以用于在各个Handler之间利用该信息,做些符合需求的处理,例如某两个Handler约定,前一个Handler如果置isHandle[0]为true了,则后一个Handler就不必处理该请求了

      建议自建一个Handler调试一下,试着改变isHandle[0]的值,看程序执行流程

    借宝地问下:如果用了Nginx、Tengine等,.css.js.html等静态文件就不需要jfinal处理了。。jfinal里该怎么配置呢?
    ######完全不需要处理。用nginx、Tengin接管了.css.js.html静态请求,那么jfinal根本接收不到此类请求,又何需处理呢?######

    通过配置web.xml ,容器将请求全部转给jfinal ,jfinal顶层直接用indexof(".") ,判断链接里有没有点,有点就交给容器处理。没有就继续向下执行。虽说复杂了点,但是性能损失可以忽略不计。

    前段nginx如果拦截了带点的静态请求,nginx就直接读硬盘发文件了。后端经都不会经过。

    ######因为springmvc有类似的设置
    <!--HandlesHTTPGETrequestsfor/resources/**byefficientlyservingupstaticresourcesinthe${webappRoot}/resources/directory-->
       <mvc:resourcesmapping="/*.ico"location="/resources/"order="2"/>
       <mvc:resourcesmapping="/resources/**"location="/resources/"order="1"/>

    看来我想多了。。。
    2020-06-09 10:59:03
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载