Jfinal 加入urlrewrite功能 实现URL 重写

因为要用Jfinal 写CMS,所以需要用到大量Urlwrite 功能

自己写了一个分享给大家,

写的比较糙,特别是@@分隔符,有改进办法欢迎讨论

没有用XML 直接用properties,

流程是 properties的配置转成List,通过Handler然后逐行匹配url请求 进行转化成真正的url请求,符合条件直接return,停止循环,所以优先级比较高的建议放在配置文件上方.

参数最多加了4个,可以在实现类里自己添加,没有写成循环所有,因为可能出现需要$2不需要$1的情况

全局处理器 加入写好的Handler

/**
	 * 配置全局处理器
	 */
	@Override
	public void configHandler(Handlers me) {
		
		me.add(new UrlRewriteHandler());

	}


Handle 文件

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jfinal.handler.Handler;

public class UrlRewriteHandler extends Handler {
	
	public UrlRewrite ur;
	
	public  UrlRewriteHandler() {
		ur=new UrlRewrite("urlrewrite.properties");
	}

	@Override
	public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
		// TODO Auto-generated method stub
		
		target=ur.rewriteUrl(target.toLowerCase());
		
		nextHandler.handle(target, request, response, isHandled);
		
	}
	
	
}


实现类

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.jfinal.kit.LogKit;
/**
 * 读取配置文件
 * 转化配置文件
 * Todd
 */
public class UrlRewrite {
	private List urllist;

	public UrlRewrite(String fileName) {
		InputStream inputStream = null;
		try {
			inputStream = getClassLoader().getResourceAsStream(fileName); // properties.load(Prop.class.getResourceAsStream(fileName));
			if (inputStream == null) {
				throw new IllegalArgumentException("Properties file not found in classpath: " + fileName);
			}
//			properties = new Properties();
//			properties.load(new InputStreamReader(inputStream));
//			System.out.println("Rewrite rules loading..");
			loadlist(new BufferedReader(new InputStreamReader(inputStream)));
		} catch (IOException e) {
			throw new RuntimeException("Error loading properties file.", e);
		} finally {
			if (inputStream != null)
				try {
					inputStream.close();
				} catch (IOException e) {
					LogKit.error(e.getMessage(), e);
				}
		}
	}

	private ClassLoader getClassLoader() {
		ClassLoader ret = Thread.currentThread().getContextClassLoader();
		return ret != null ? ret : getClass().getClassLoader();
	}

	// 加载urlwrite文件 ,转化List格式传回
	private List loadlist(BufferedReader reader) throws IOException {
		String line;
		urllist = new ArrayList();

		while (reader.ready()) {
			line = reader.readLine().replaceAll(" ", "");
			if(!line.contains("#")) {
				urllist.add(line);
			}
		}
		line = null;
		reader.close();
		return urllist;
	}


	// url rewrite
	public String rewriteUrl(String target) {
		String[] rexlines;
		Pattern p;
		Matcher m;
		
		for (int i = 0; i < urllist.size(); i++) {
			rexlines = String.valueOf(urllist.get(i)).split("@@");
			
			if (rexlines.length == 2) {
				
				p = Pattern.compile(rexlines[0].trim());
				m = p.matcher(target);
				
				if (m.find()) {
					target = rexlines[1].trim();
					//存在只有$2 没有$1的情况,所以不做FOR或者WHILE循环,最多4个参数
					if (rexlines[1].contains("$1")) {
						target = target.replaceAll("\\$1", m.group(1));
					}
					if (rexlines[1].contains("$2")) {
						target = target.replaceAll("\\$2", m.group(2));
					}
					if (rexlines[1].contains("$3")) {
						target = target.replaceAll("\\$3", m.group(3));
					}
					if (rexlines[1].contains("$4")) {
						target = target.replaceAll("\\$4", m.group(4));
					}
					
					return target;
				}
			}
		}

		return target;
	}
}


配置文件 @@分隔符, 语法类似urlrewrite xml 配置文件 (*******) = $1 格式

# ---URL Rewrite---
# @@ 分离符
#


# ===========ticket=============== 
#/aucn/  = /ticket/1
^/aucn/$  @@  /ticket/1
#/cnau/  = /ticket/2
^/cnau/$  @@  /ticket/2
#/syd/  = /ticket/city/syd
^/([A-Za-z]{3})/$  @@  /ticket/city/$1
#/syd/pek  = /ticket/citytocity/syd-pek
^/([A-Za-z]{3})/([A-Za-z]{3})$  @@  /ticket/citytocity/$1-$2


评论区

JFinal

2019-05-08 09:46

自己动手,丰衣足食,又少引入一个第三方

热门分享

扫码入社