【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

其他的基础控制器有

  • ApiControllerBase类,用于Api业务的处理。比如获取微信用户的OpenId,获取当前用户的 unionId,重新登陆的接口,失效接口等。

  • TemplateControllerBase类,用于模板业务的处理。比如基础的模板渲染,是否存在模板,模板重定向,渲染默认模板等。

  • UcenterControllerBase类,用用户中心业务的处理。UcenterControllerBase类本身没有重写方法,它配置了预防 csrf 攻击的拦截器、用户信息的拦截器、要求用户必须登陆的拦截器、用户中心的拦截器,其子类也将自动继承这些拦截器。

  • UserControllerBase类,其用途基本和UcenterControllerBase类差不多,但是拦截器更少,限制稍少。

三、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包的拦截器的分析。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值