在Spring MVC中想要對每一個URL進行權限控制,不想手工整理這樣會有遺漏,所以就動手寫程序了。代碼如下:
/**
* @return
* @author Elwin ZHANG
* 創建時間:2017年3月8日 上午11:48:22
* 功能:返回系統中的所有控制器映射路徑,以及對應的方法
*/
@RequestMapping(value = "/maps", produces = "application/json; charset=utf-8")
@ResponseBody
public Object getMapPaths(){
String result="";
RequestMappingHandlerMapping rmhp = springHelper.getObject(RequestMappingHandlerMapping.class);
Map<RequestMappingInfo, HandlerMethod> map = rmhp.getHandlerMethods();
for(RequestMappingInfo info : map.keySet()){
result +=info.getPatternsCondition().toString().replace("[", "").replace("]", "")+ "\t" ;
HandlerMethod hm=map.get(info);
result +=hm.getBeanType().getName()+ "\t" ;
result +=getMethodParams(hm.getBeanType().getName(),hm.getMethod().getName())+ "\t";
result +=info.getProducesCondition().toString().replace("[", "").replace("]", "")+ "\t" ;
result += "\r\n";
}
return result;
}
getMethodParams是專門用于獲取方法中參數名稱的函數,因為用Java自身的反射功能是獲取不到的,浪費我不少時間,后來網上看到JBOSS的JAVAssist類可以。其實這個JAVAssist類庫也被封裝在Mybatis中,如果系統使用了Mybatis,則直接引入可以使用了。
import org.apache.ibatis.javassist.*;
import org.apache.ibatis.javassist.bytecode.*;
getMethodParams 的實現如下:
/**
* @param className 類名
* @param methodName 方法名
* @return 該方法的聲明部分
* @author Elwin ZHANG
* 創建時間:2017年3月8日 上午11:47:16
* 功能:返回一個方法的聲明部分,包括參數類型和參數名
*/
private String getMethodParams(String className,String methodName){
String result="";
try{
ClassPool pool=ClassPool.getDefault();
ClassClassPath classPath = new ClassClassPath(this.getClass());
pool.insertClassPath(classPath);
CtMethod cm =pool.getMethod(className, methodName);
// 使用javaassist的反射方法獲取方法的參數名
MethodInfo methodInfo = cm.getMethodInfo();
CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
result=cm.getName() + "(";
if (attr == null) {
return result + ")";
}
CtClass[] pTypes=cm.getParameterTypes();
String[] paramNames = new String[pTypes.length];
int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;
for (int i = 0; i < paramNames.length; i++) {
if(!pTypes[i].getSimpleName().startsWith("HttpServletRe")){
result += pTypes[i].getSimpleName();
paramNames[i] = attr.variableName(i + pos);
result += " " + paramNames[i]+",";
}
}
if(result.endsWith(",")){
result=result.substring(0, result.length()-1);
}
result+=")";
}catch(Exception e){
e.printStackTrace();
}
return result;
}
這樣就可以獲得每個URL路徑與期對應的方法聲明了。
另外SpringHelper是自己封裝的Spring工具類,可以用來直接獲取Spring管理的Bean,代碼如下:
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
/**
* @author Elwin ZHANG
* 創建時間:2016年4月14日 上午9:12:13
* 功能:Spring 工具類,用于獲取Spring管理的Bean
*/
@Component
public class SpringHelper implements ApplicationContextAware {
// 日志輸出類
private static Logger logger = Logger.getLogger(SpringHelper.class);
// 當前的Spring上下文
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext arg0)
throws BeansException {
applicationContext = arg0;
}
/**
* @param beanName bean Id
* @return 如果獲取失敗,則返回Null
* @author Elwin ZHANG
* 創建時間:2016年4月14日 上午9:52:55
* 功能:通過BeanId獲取Spring管理的對象
*/
public Object getObject(String beanName) {
Object object = null;
try {
object = applicationContext.getBean(beanName);
} catch (Exception e) {
logger.error(e);
}
return object;
}
/**
* @return
* @author Elwin ZHANG
* 創建時間:2017年3月7日 下午3:44:38
* 功能:獲取Spring的ApplicationContext
*/
public ApplicationContext getContext() {
return applicationContext;
}
/**
* @param clazz 要獲取的Bean類
* @return 如果獲取失敗,則返回Null
* @author Elwin ZHANG
* 創建時間:2016年4月14日 上午10:05:27
* 功能:通過類獲取Spring管理的對象
*/
public <T> T getObject(Class<T> clazz) {
try {
return applicationContext.getBean(clazz);
} catch (Exception e) {
logger.error(e);
}
return null;
}
/**
* @param code 配置文件中消息提示的代碼
* @param locale 當前的語言環境
* @return 當前語言對應的消息內容
* @author Elwin ZHANG
* 創建時間:2016年4月14日 上午10:34:25
* 功能:獲取當前語言對應的消息內容
*/
public String getMessage(String code,Locale locale){
String message;
try{
message=applicationContext.getMessage(code, null, locale);
}catch(Exception e){
logger.error(e);
message="";
}
return message;
}
/**
*
* @param code 配置文件中消息提示的代碼
* @param request 當前的HTTP請求
* @return 當前語言對應的消息內容
* @author Elwin ZHANG
* 創建時間:2016年4月14日 下午3:03:37
* 功能:獲取當前語言對應的消息內容
*/
public String getMessage(String code,HttpServletRequest request){
String message;
try{
message=applicationContext.getMessage(code, null, getCurrentLocale(request));
}catch(Exception e){
logger.error(e);
message="zh_CN";
}
return message;
}
/**
* @param request 當前的HTTP請求
* @return 當前用戶Cookie中的語言
* @author Elwin ZHANG
* 創建時間:2016年4月14日 下午2:59:21
* 功能:當前用戶保存Cookie中的默認語言
*/
public Locale getCurrentLocale(HttpServletRequest request){
return resolver.resolveLocale(request);
}
//Cookie本地語言解析器,Spring提供
@Autowired
CookieLocaleResolver resolver;
}