其他分享
首页 > 其他分享> > 【JPress】core.web(1)

【JPress】core.web(1)

作者:互联网

2021SC@SDUSC


目录

一、core.web

二、core.web.base

1.ControllerBase

2.AdminControllerBase

3.OtherControllerBase

三、core.web.interceptor

1.基本用途

2.JPressInterceptor


一、core.web

core.web包是处理核心业务的web模块的包,其结构如下:

二、core.web.base

core.web.base包中都是控制器,即MVC模块中的controller,其结构如下:

里面有很多基础业务的controller,他们都继承ControllerBase类,查看里面的方法,它们都有一个相同注解:

@NotAction

其含义为该方法不希望成为 action,仅供子类调用,或拦截器中调用,而不是暴露在端口下。

1.ControllerBase

ControllerBase类里面大部分的方法都是封装了JbootController的获取参数方法,根据JPress的模板业务,自己封装了一些代码逻辑,比如:

    @NotAction
    public Long getIdPara() {
        Long id = getParaToLong();
        if (id == null) {
            //renderError 会直接抛出异常,阻止程序往下执行
            renderError(404);
        }
        return id;
    }

对于ControllerBase所有的子类,如果调用这个方法时抛出了异常,会直接渲染错误的资源,阻止程序往下执行。

2.AdminControllerBase

其他继承了ControllerBase类的子类,我只拿AdminControllerBase类做例子,其他类简略带过。

AdminControllerBase类作为ControllerBase类的子类,其本身也是一个中间的Controller,故其方法也都是@NotAction,仅限于子类、拦截器调用。

另一个相同之处是,基本每一个继承了AdminControllerBase类的controller都有@Before注解,这个是JFinal的AOP切面编码的实现注解,用来对拦截器进行配置。AdminControllerBase类的@Before注解作用于Class级别,将拦截AdminControllerBase类中的所有方法。

@Before({
        CSRFInterceptor.class,
        AdminInterceptor.class,
        UserInterceptor.class,
        PermissionInterceptor.class
})
public abstract class AdminControllerBase extends ControllerBase {
    ...
}

里面的拦截器在core.web.interceptor包下,上述代码的拦截器用于预防 csrf 攻击的拦截器,用于管理后台的拦截器和用户信息的拦截器。

AdminControllerBase类大概是处理管理后台的业务,比如renderErrorForNoPermission()渲染无权限信息,renderError()渲染错误信息,用于子类的调用。

3.OtherControllerBase

其他的基础控制器有

三、core.web.interceptor

core.web.interceptor包有AOP中的拦截器,该包下大部分都为core.base中controller的拦截器,其他的JPressInterceptor、UTMInterceptor为全局业务拦截器。core.web.interceptor包结构如下:

1.基本用途

对base控制器中的方法进行拦截,并提供机会在方法的前后添加切面代码,实现 AOP 的核心目标。core.web.interceptor基本上实现了JPress的网络安全管理、用户权限管理、模板信息管理等过滤拦截。

2.JPressInterceptor

这是一个比较重要的JPress全局拦截器,控制、业务拦截器中我只拿JPressInterceptor类做例子,其他类简略带过。

其拦截方法intercept为JPress所有业务层的拦截方法,其中比较重要的部分如下:

        Enumeration<String> paraKeys = controller.getParaNames();
        if (paraKeys != null) {
            while (paraKeys.hasMoreElements()) {
                String key = paraKeys.nextElement();
                if (key != null && key.endsWith(".options")) {
                    LogKit.error("paras has options key :" + key);
                    controller.renderError(404);
                    return;
                }
            }
        }

对于被拦截所有的参数,如果以“.options”字符串结尾,那么将直接渲染错误页面,这是因为model类本身有很多 options 字段,用于扩展 model 本身的内容。所以为了安全起见,不让客户端提交 .options对 model 本身的 options 字段进行覆盖。

这明显是对JPress的一个安全拦截。

以上就是base包的基础控制器和interceptor包的拦截器的分析。

标签:core,拦截器,ControllerBase,JPress,AdminControllerBase,web,interceptor
来源: https://blog.csdn.net/qq_42430054/article/details/120931958