2021SC@SDUSC
目录
一、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包的拦截器的分析。