关于setErrorRenderFactory的问题

跳蚤 发布于 2016/05/27 17:58
阅读 152
收藏 1

项目中使用JFinal,我想使用自己定义的错误页面的渲染。

public void configConstant(Constants me) {
        me.setDevMode(true);
        me.setBaseViewPath("WEB-INF/templates");
        me.setViewType(ViewType.FREE_MARKER);
        me.setErrorRenderFactory(new GlobalErrorRenderFactory());
    }


GlobalErrorRenderFactory.java


public class GlobalErrorRenderFactory implements IErrorRenderFactory {

    public Render getRender(int errorCode, String view) {
        return new GlobalRender(errorCode, view);
    }

}





GlobalRender.java


public class GlobalRender extends FreeMarkerRender {

    protected static final String json404 = "404 Not Found";
    protected static final String json500 = "500 Internal Server Error";
    protected static final String json401 = "401 Unauthorized";
    protected static final String json403 = "403 Forbidden";

    private int errorCode;

    public GlobalRender(int errorCode, String view) {
        super(view);
        this.errorCode = errorCode;
    }

    public void render() {
        response.setStatus(errorCode);

        boolean isAjax = false;

        //如果Ajax请求,返回json
        if (RequestUtils.isAjaxRequest(this.request)) {
            isAjax = true;
        }

        switch (errorCode) {
            case 401:
                if (isAjax) {
                    RenderFactory.me().getJsonRender(AjaxResult.createFailedResult(json401)).render();
                } else {
                    setView("WEB-INF/templates/error/401.ftl");
                    super.render();
                }
                break;
            case 403:
                if (isAjax) {
                    RenderFactory.me().getJsonRender(AjaxResult.createFailedResult(json403)).render();
                } else {
                    setView("WEB-INF/templates/error/403.ftl");
                    super.render();
                }
                break;
            case 404:
                if (isAjax) {
                    RenderFactory.me().getJsonRender(AjaxResult.createFailedResult(json404)).render();
                } else {
                    setView("WEB-INF/templates/error/404.ftl");
                    super.render();
                }
                break;
            case 500:
                if (isAjax) {
                    RenderFactory.me().getJsonRender(AjaxResult.createFailedResult(json500)).render();
                } else {
                    setView("WEB-INF/templates/error/500.ftl");
                    super.render();
                }
                break;
            default:
                super.render();
        }
    }

}




现在遇到的问题是, 当我浏览器访问一个不存在的页面 http://localhost/1/2时, 是正常的,显示我自定义的 404页面




但是当我访问带“点”的,不存在的地址, 比如 http://localhost/1/1.abc ,则显示的tomcat默认404页面


求教各路大神, 这是为什么?


另外我加了Shiro插件,不知道是否有影响


[urls] 
/login/**=anon 
/admin/**=authc




加载中
0
跳蚤
跳蚤


看了源码,这个问题!


求问, 问什么带点 他就不处理? 

这样我还得自己去写一个错误页面的跳转?

0
JFinal
JFinal

   带"." 的请求,被认为是静态请求,例如 xxx.css、yyy.js、zzz.jpg 这类静态资源请求,这类请求通常直接交给 nginx、tomcat、jetty 之类的去处理,而框架只关注动态请求,静态请求出现 404 是某个静态资源不存在,这类错误通常是需要手工去处理的。

   在生产环境下通常 nginx 在前端接管静态请求是标配,所以即便是你的项目想处理静态请求都无法直接触及。

   最后,如果一定要在项目中处理静态请求,可使用一个 Handler,然后可以使用 jfinal 提供的 HandkerKit中的方法跳转到任意的页面。

JFinal
JFinal
回复 @跳蚤 : jfinal 的处理方式兼顾性能考虑,target.indexOf('.') 速度极快,比那种需要多次判断不同类型的后缀方式,起码快几个数量级
跳蚤
跳蚤
静态资源可参考spring的 mvc:resources 标签,显示配置觉得更清晰。 而且不见得带.的都是静态资源哦
返回顶部
顶部