1.controller 部分的代码
@RequestMapping("/service")
@ResponseBody
public Map<String, Object> service(HttpServletRequest request,HttpServletResponse response){
String ip = request.getRemoteAddr();
boolean flag = false;
flag = ipConfig.judge(ip,request.getParameter("userDevice")); // 限制接口访问者的IP 代码
if(!flag){
return null;
}
//获取request值
Map<String,Object> param = CgtUtil.getParameterMapObject(request);
//running 表中type值
param.put("payServiceType", 2);
Map<String, Object> map = paymentService.excute(param);
//返回存管通返回的字符串
return map;
}
限制接口访问者的IP 代码
public boolean judge(String ip ,String userDevice){
boolean res = false;
if(null==ip || "".equals(ip))return false;
if(null==userDevice || "".equals(userDevice))return false;
IpconfigEntity par = new IpconfigEntity();
par.setIp(ip);
par.setSource(userDevice);
List<IpconfigEntity> resList = ipConfigDao.queryEntityByPar(par); 可用iP存在数据库中
if(resList.size()>0)res=true;
return res;
}
-------根据service名称查找对应的实例----------
public Map<String, Object> excute(Map<String, Object> par) {
log.info("protocol init...");
checkService = payConfig.getCheckConfig(); //加载检查类
boolean flag = checkConfig(par); //检查参数是否正确
// log.info("judge parameter is null.");
if(!flag)return returnError(ServerException.PARAMETES_EXCEPTION);
String serviceName = this.findServiceName(par.get("code").toString());
// String serviceName = CodeRemoteServiceMappingEnum.getServiceName(par.get("code").toString());
Object obj= payService.findService(serviceName);//查找对应service名称的实例 对应下边的代码↓
flag = checkMethod(par, obj.getClass());
if(!flag)return returnError(ServerException.VERSION_EXCEPTION);
log.info("parameter access.");
Method m =payService.findMehod(par.get("version").toString(),obj.getClass());
//检查接口类型是否匹配
if(par.get("version").toString().startsWith("v")){
Integer serviceType = Integer.valueOf(par.get("payServiceType").toString());
if(!this.judgeServiceType(par.get("code").toString(), serviceType)){
if(serviceType==1)return returnError(ServerException.GATEWAY_TYPE_EXCEPTION);
if(serviceType==2)return returnError(ServerException.SERVICE_TYPE_EXCEPTION);
}
}
log.info("start protocol.");
try{
boolean resFlag=writeRunningService.writeRunning(par);
if(!resFlag){
throw new Exception("插入日志失败.");
}
}catch(Exception e){
writeRunningService.insertException(par.get("code").toString(), e.getMessage());
log.error("log write Exception."+e.getMessage());
}
try{
Object resObj= m.invoke(obj, par);
if(resObj != null){
par.put("data", resObj);
//判断直连返回值
this.judgeDataStatus(par);
}
}catch(Exception e){
e.printStackTrace();
if(e.getCause() instanceof PaymentException){
PaymentException pe = (PaymentException)e.getCause();
return returnError(ServerException.getExceptionByIndex(pe.getIndex()));
}
return returnError(ServerException.SERVICE_EXCEPTION);
}
log.info("end protocol.");
if(par.get("status") == null){
par.put("status", ServerException.getCodeByIndex(0));
par.put("msg", ServerException.EXCUTE_SUCCESS.getMsg());
}
return par;
}
对应上边的代码↑
@Service
public class PayServiceImp implements PayService {
@Autowired
private ApplicationUtil applicationUtil;
@Override
public <T> T findService(String s) {
return applicationUtil.getBean(s);
}
@Override
public Method findMehod(String m,Class<?> cls) {
Method method = null;
try {
method = cls.getMethod(m,Map.class);
} catch (Exception e) {
e.printStackTrace();
}
return method;
}
}
---
当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean。换句话说,就是这个类可以直接获取spring配置文件中,所有有引用到的bean对象。
@Component
public class ApplicationUtil implements ApplicationContextAware {
private static ApplicationContext app ;
public static <T> T getBean(Class<?> cls){
return (T)app.getBean(cls);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
// TODO Auto-generated method stub
app = applicationContext;
}
@SuppressWarnings("unchecked")
public <T> T getBean(String bean){
return (T) app.getBean(bean);
}
}