package com.api.controller;
import java.lang.reflect.Method;
import java.util.Arrays;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.HandlerMapping;
import com.api.controller.core.room.RoomController1_0;
import com.api.controller.factory.ControllerAbstractFactoryImpl;
import com.api.modules.Conf;
import com.api.modules.State;
import com.api.util.Log;
import com.api.util.ResultValue;
import com.api.util.annotations.RequestAlias;
import com.api.util.annotations.RequestStrategyUtils;
import com.api.util.exception.ApiVersionException;
/**
* 核心Controller
*
* @see 只有这个controller提供对外访问
*
* @author Allen 2017年5月24日
*
*/
@RequestMapping(value = "/{domain}/{version}")
@Controller
public class CoreController {
/** class Constant **/
final String ROOM = "room";
final String USER = "user";
final String[] DOMAINS = new String[] { ROOM, USER };
String methodName = null;// 调用类名
Object[] obParam = null;// 参数组
Object result = null;// method返回值
/**
* 多版本代理指向Controller
*
* @throws Exception
*/
@ResponseBody
@RequestMapping("/**")
public Object exeucte(@PathVariable String domain, @PathVariable String version, String callback,
HttpServletRequest req) {
Object ob = req.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
if (ob == null) // 参数为空
return ResultValue.execute(State.NPE, callback);
String val = ob.toString();
val = val.substring(val.indexOf(version) + version.length() + 1);
if (Arrays.asList(DOMAINS).indexOf(domain) == -1)
return ResultValue.execute(State.DOMAINNOTFOUND, callback);
else {
try {
Class<?> clazz = selectClass(version, domain);
if (clazz == null)
return ResultValue.execute(State.VERSIONERROR, callback);
analysis(val, version);
int flag = targetMethod(clazz, req);
if (flag == -1) {// IP访问权限不足
return ResultValue.execute(State.IPPERMISSIONS, callback);
} else if (flag == -2) {// 找不到的访问域
return ResultValue.execute(State.DOMAINNOTFOUND, callback);
} else if (result == null) { // 返回值为null,controller业务参数判定有无
return ResultValue.execute(State.NPE, callback);
} else { // success
return ResultValue.execute(State.SUCCESS, result, callback);
}
} catch (SecurityException e) {
return ResultValue.execute(State.NPE, callback);
} catch (NoSuchMethodException | IllegalArgumentException e) {
return ResultValue.execute(State.DOMAINNOTFOUND, callback);
} catch (ApiVersionException e) {
return ResultValue.execute(State.VERSIONERROR, callback);
} catch (Exception e) {
Log.printlog(RoomController1_0.class, e);
return ResultValue.execute(State.EXCEPTION, callback);
}
}
}
/**
* 获取class
*
* @param version
* @param domain
* @return
* @throws Exception
*/
private Class<?> selectClass(String version, String domain) throws Exception {
switch (domain) {
case ROOM:
return ControllerAbstractFactoryImpl.instance(version).iRoomController().Class();
case USER:
return ControllerAbstractFactoryImpl.instance(version).iUserController().Class();
default:
return null;
}
}
/**
* 执行目标函数
*
* @param clazz
* @param method
* @return
* @throws Exception
*/
private int targetMethod(Class<?> clazz, HttpServletRequest req) throws Exception {
Method[] methods = clazz.getMethods();
// 找到目标method并配置参数类型class
for (Method m : methods) {
// 通过注解判断是否匹配访问domain
if (m.isAnnotationPresent(RequestAlias.class)
&& m.getAnnotation(RequestAlias.class).value().equals(methodName)) {
if (!ipControl(getRemoteHost(req), clazz, m)) {
// ip不匹配访问权限
return -1;
}
result = clazz.getMethod(m.getName(), m.getParameterTypes()).invoke(clazz.newInstance(), obParam);
return 0;
}
}
return -2;
}
/**
* 解析请求url
*
* @param str
*/
private void analysis(String str, String version) {
Object[] params = str.split("/");
methodName = params[0].toString();
obParam = new StringBuilder(str).delete(0, methodName.length()).insert(0, version).toString().split("/");
}
/**
* 访问者ip获取
*
* @param request
* @return
*/
private String getRemoteHost(HttpServletRequest request) {
/**
* method constant
*/
String X_FORWARDED_FOR = "x-forwarded-for";
String PROXY_CLIENT_IP = "Proxy-Client-IP";
String WL_PROXY_CLIENT_IP = "WL-Proxy-Client-IP";
String LOOPBACK = "0:0:0:0:0:0:0:1";// 环回地址
String UNKNOWN = "unknown";
String ip = request.getHeader(X_FORWARDED_FOR);
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader(PROXY_CLIENT_IP);
}
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader(WL_PROXY_CLIENT_IP);
}
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip.equals(LOOPBACK) ? Conf.LOCAL_IP : ip;
}
/**
* IP访问控制
*
* @param request
* @param response
* @param handler
* @return
*/
private boolean ipControl(String requestIp, Class<?> clazz, Method m) throws Exception {
if (clazz != null && m != null) {
boolean isClazz = clazz.isAnnotationPresent(RequestStrategyUtils.class);
boolean isMethod = m.isAnnotationPresent(RequestStrategyUtils.class);
RequestStrategyUtils rc = null;
// 如果方法和类声明中同时存在这个注解,那么方法中的会覆盖类中的设定。
rc = isMethod ? m.getAnnotation(RequestStrategyUtils.class)
: isClazz ? clazz.getAnnotation(RequestStrategyUtils.class) : null;
if (rc == null)
return false;
String[] value = rc.ip();
// 包含则true
return Arrays.asList(value).stream().anyMatch(s -> s.equals(Conf.All_IP)
|| ((s.equals(Conf.LOCAL_IP) || (s.equals(Conf.DEVELOP_IP))) && s.indexOf(requestIp) != -1));
}
return false;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
SpringMVC 多版本接口/IP访问控制/ANT打包发布到LINUX (131个子文件)
CoreController.class 8KB
SendMail.class 5KB
Log.class 4KB
ProxoolDataSourceFactory.class 2KB
State.class 2KB
ControllerAbstractFactoryImpl.class 2KB
CheckData.class 2KB
UserController1_0.class 2KB
ServiceAbstractFactoryImpl.class 2KB
DaoProxy.class 2KB
Conf.class 1KB
PropertiesUtil.class 1KB
ResultValue.class 1KB
MybatisLink.class 1KB
UserDao$2.class 1KB
UserDao$1.class 1KB
RoomDao$1.class 1KB
UserController1_1.class 1KB
RoomController1_0.class 1KB
ResultVo.class 1KB
UserDao.class 1KB
UserService1_1.class 1KB
UserVo.class 1KB
UserService1_0.class 1007B
RoomDao.class 895B
RoomVo.class 864B
Controller1_0.class 731B
Service1_0.class 667B
RoomService1_0.class 663B
Controller1_1.class 570B
RequestStrategyUtils.class 567B
RequestAlias.class 545B
Service1_1.class 495B
IUser.class 483B
IBaseController.class 403B
ApiVersionException.class 395B
DaoProxy$ISql.class 298B
IControllerAbstractFactory.class 287B
IServiceAbstractFactory.class 265B
IRoom.class 262B
IController.class 247B
IService.class 225B
.classpath 862B
org.eclipse.wst.common.component 467B
org.eclipse.wst.jsdt.ui.superType.container 49B
500.html 138B
404.html 138B
mybatis-3.3.1.jar 1.49MB
jackson-databind-2.7.4.jar 1.15MB
spring-context-4.3.6.RELEASE.jar 1.08MB
spring-core-4.3.6.RELEASE.jar 1.07MB
spring-webmvc-4.3.6.RELEASE.jar 893KB
spring-web-4.3.6.RELEASE.jar 798KB
mysql-connector-java-5.1.16-bin.jar 768KB
spring-beans-4.3.6.RELEASE.jar 745KB
httpclient-4.5.jar 711KB
log4j-1.2.17.jar 478KB
fastjson-1.2.9.jar 384KB
spring-aop-4.3.6.RELEASE.jar 371KB
mail.jar 339KB
proxool-cglib.jar 327KB
httpcore-4.4.1.jar 315KB
spring-expression-4.3.6.RELEASE.jar 257KB
junit-4.10.jar 247KB
jackson-core-2.7.4.jar 247KB
proxool-0.9.1.jar 196KB
servlet-api.jar 193KB
commons-dbcp-1.3.jar 145KB
org.json.jar 117KB
commons-logging-1.2.jar 60KB
jackson-annotations-2.7.4.jar 50KB
jstl.jar 17KB
CoreController.java 6KB
SendMail.java 5KB
ProxoolDataSourceFactory.java 4KB
Log.java 2KB
Conf.java 2KB
UserController1_0.java 1KB
ControllerAbstractFactoryImpl.java 1KB
ServiceAbstractFactoryImpl.java 1KB
ResultValue.java 913B
MybatisLink.java 879B
UserDao.java 816B
ResultVo.java 810B
RoomController1_0.java 782B
CheckData.java 781B
DaoProxy.java 779B
PropertiesUtil.java 736B
UserController1_1.java 662B
UserVo.java 650B
State.java 641B
RoomDao.java 618B
RequestStrategyUtils.java 614B
RequestAlias.java 605B
Controller1_0.java 589B
Service1_0.java 558B
RoomVo.java 531B
UserService1_1.java 519B
UserService1_0.java 507B
RoomService1_0.java 412B
共 131 条
- 1
- 2
资源评论
- wy3813565322017-12-10东西一般般,不怎么好,偏积分的
is丶Allen
- 粉丝: 43
- 资源: 19
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Image_1713714819368.png
- 数据可视化 matplotlib 实例.docx
- Python 使用 Matplotlib 绘制甘特图的实践.docx
- matplotlib 中的 cmap 参数介绍.docx
- 基于matlab的毕业设计基于Matlab使用LQR实现车辆轨迹跟踪源码.zip
- 基于Matplotlib 的高互动性可视化系统设计与实现
- matplotlib 数据可视化报告.docx
- 传统网页UI设计在移动应用开发中的应用研究.pdf
- 基于pytorch实现BERT+BiLSTM+CRF实现中文命名实体识别源码.zip
- 校园帮项目,毕业设计/课程设计/javaWeb/SSM
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功