UUID等主键包含减号的模板操作兼容方案
王多多 发布于86月前 2答/2506阅

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);
	}

水平有限,请多指教。


[沙发] ╰☆凡枫落★
感觉还不错的样子。没试试。。。。。。。。。
[地板] 风雪夜归人
@王多多  试过,可以搞定,谢谢了!
提交评论
嘿,我来帮你!