王多多 发布于95月前 2答/2645阅
JFinal urlPara可以在一次请求中同时携带多个值,JFinal 默认使用减号“-”来分隔多个值(可通过 constants. setUrlParaSeparator(String)设置分隔符),在 Controller 中可以通过 getPara(int index)分别取出这些值。
↓
可是EOVA在前端写死了这个分隔符为减号,如果直接在后端设置为其它字符,EOVA将无法正常使用。
↓
然而有些场景若不修改分隔符将会产生错误,比如数据表主键使用UUID默认规则,UUID值中包含减号,和默认分隔符冲突,导致后台getPara方法取到的主键值是错误的,在EOVA中的体现就是该数据表的“修改”和“查看”按钮不能正常工作。
↓
在主键必须包含减号、不修改EOVA源码、最小侵入的考虑下,增加JFinal全局拦截器,可在修改JFinal urlPara分隔符后,兼容EOVA已使用的减号分隔符,解决无法修改和查看的问题:
import com.eova.common.utils.xx;
import com.eova.common.utils.util.AntPathMatcher;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Const;
import com.jfinal.core.Controller;
import com.jfinal.core.JFinal;
/**
* 注意将此拦截器设置为JFinal拦截器列表中的第一个,否则上游拦截器获取URL参数时可能会有问题
* @version base eova 1.6
* @author 多多
*/
public class JParaInterceptor implements Interceptor {
private static final String EOVA = Const.DEFAULT_URL_PARA_SEPARATOR;
private static final String MY = "&";// 自定义分隔符
public JParaInterceptor() {
JFinal.me().getConstants().setUrlParaSeparator(MY);
System.err.println("set JFinal urlParaSeparator:" + MY);
}
@Override
public void intercept(Invocation inv) {
Controller target = inv.getController();
String urlPara = target.getPara();
// 如果URL参数不包含EOVA使用的分隔符,则不需要转义
if (xx.isEmpty(urlPara) || !urlPara.contains(EOVA) || MY.equals(EOVA)) {
inv.invoke();
return;
}
// "/form/update"
// "/form/detail"
// 以上两个请求只转义第一个分隔符,保留后续字符(即更新、查看的主键值)
// 除以上特殊请求,其它请求全部转义
AntPathMatcher pm = new AntPathMatcher();
String uri = inv.getActionKey();
if (pm.match("/form/update", uri)) {
urlPara = urlPara.replaceFirst(EOVA, MY);
} else if (pm.match("/form/detail", uri)) {
urlPara = urlPara.replaceFirst(EOVA, MY);
} else if (pm.match("/widget/findCnByEn", uri)) {
// 此请求转义前两个分隔符
for (int i = 0; i < 2; i++)
urlPara = urlPara.replaceFirst(EOVA, MY);
} else {
urlPara = urlPara.replace(EOVA, MY);
}
// 更新URL参数
target.setUrlPara(urlPara);
inv.invoke();
}
}
OSSConfig中添加使用:
@Override
public void configInterceptor(Interceptors me) {
me.add(new JParaInterceptor());
super.configInterceptor(me);
}
水平有限,请多指教。