ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【JPress】core.web(1)

2021-10-24 12:02:21  阅读:160  来源: 互联网

标签:core 拦截器 ControllerBase JPress AdminControllerBase web interceptor


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

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有