我想根据客户端ID从不同的服务器获取数据。
PS:一切都在https上运行,stackoverflow不允许我放置2个以上的链接,这就是我删除https部分的原因。
假设我的代理控制器服务器正在运行 - 192.168.2.0:8080
我有多台服务器,假设服务器A位于192.168.2.20:8080,服务器B位于192.168.2.30:8080。
如果我的用户aaa正在攻击代理控制器,它应该从服务器A获得响应,如果用户bbb正在攻击代理服务器,它应该从服务器B获得响应。
例如。 192.168.2.0:8080/api/aaa/ui/index.html实际应该拨打192.168.2.20:8080/ui/index.html,客户应该得到回应。
与bbb用户相同,在这种情况下,响应应来自192.168.2.30:8080/ui/index.html。
此用例适用于静态内容,但不适用于动态内容。我无法从服务器获取动态数据。
我猜我的内部服务器正在给我
我的控制器上的代码。 控制器
这会处理URL并调用此函数。 它将采用类似http://localhost:8080/userId/ui/index.html的网址 并根据userId调用服务器,UserId可以是aaa或bbb。
@RequestMapping(value = "/{userId}/**", method= RequestMethod.GET)
@ResponseBody
public String HTTPControllerEntry(@PathVariable("userId") String userId,HttpServletRequest request){
String urlEndSubstring = (String)request.getAttribute(
HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
int index = urlEndSubstring.indexOf('/',1 + urlEndSubstring.indexOf('/'));
urlEndSubstring = urlEndSubstring.substring(index+1);
String URL = userId+urlEndSubstring;
String response=httpRedirectionService.RedirectHttpUrl(userId, urlEndSubstring);
return response;
}
此函数将在userId的基础上获取URL的前缀,并使用用户的特定ipaddress生成完整的URL。
@Override
public String RedirectHttpUrl(String userId, String urlEndSubstring) {
UserConnectionProperties ucP = new UserConnectionProperties();
String urlPrefix= ucP.readUserConnectionProperty(userId);
String URL = urlPrefix+urlEndSubstring;
return callURL(URL);
}
此函数只获取http请求并将其返回给控制器。控制器将返回客户端。
private String callURL(String httpURL) {
System.out.println("Requeted URL: " + httpURL);
StringBuilder sb = new StringBuilder();
URLConnection urlConn = null;
InputStreamReader in = null;
try {
URL url = new URL(httpURL);
urlConn = url.openConnection();
if (urlConn != null)
urlConn.setReadTimeout(60 * 1000);
if (urlConn != null && urlConn.getInputStream() != null) {
in = new InputStreamReader(urlConn.getInputStream(),
Charset.defaultCharset());
BufferedReader bufferedReader = new BufferedReader(in);
if (bufferedReader != null) {
int cp;
while ((cp = bufferedReader.read()) != -1) {
sb.append((char) cp);
}
bufferedReader.close();
}
}
in.close();
} catch (Exception e) {
System.out.println(("Exception while calling URL:"+ httpURL +" "+e+"\n"));
}
return sb.toString();
}
这将根据userId
给出内部服务器的ipaddresspublic String readUserConnectionProperty(String key){
Properties prop = loadPropertyfile();
return prop.getProperty(key);
}
加载属性文件。
private Properties loadPropertyfile(){
Properties props = new Properties();
InputStream is = null;
try {
File f = new File("userConnection.properties");
is = new FileInputStream(f);
}
catch (Exception e){
is = null;
}
try {
if ( is == null ) {
is = getClass().getClassLoader().getResourceAsStream("userConnection.properties");
}
if(is!=null){
props.load( is );
}
else {
throw new FileNotFoundException("property file userConnection not found in class path");
}
}
catch ( Exception e ) { }
return props;
}
userConnection.properties
aaa=192.168.2.120:8080/
bbb=192.168.2.130:8080/
ccc=192.168.2.140:8380/
我的Html文件,我从我的服务器获取请求,aaa作为用户。
<html lang="en" ng-app="UI">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title>UI</title>
<link type="text/css" href="css/bootstrap.min.css" rel="stylesheet">
<link type="text/css" href="css/angular-material.min.css" rel="stylesheet">
<!-- custom css files -->
<link type="text/css" href="css/components.css" rel="stylesheet">
<link type="text/css" href="css/layout.css" rel="stylesheet">
<link type="text/css" href="css/views.css" rel="stylesheet">
<link type="text/css" href="css/theme.css" rel="stylesheet">
<!-- Icons/Fonts -->
<link type="text/css" href="fonts/md-icons/md-icons.css" rel="stylesheet" media="all">
<link type="text/css" href="css/roboto-fontface.css" rel="stylesheet" media="all">
<meta name="apple-mobile-web-app-capable" content="yes" />
</head>
<body ng-controller="BodyController">
<div id="authentication" data-access-token="{{ACCESS_TOKEN}}"></div>
<div ng-include="'partials/include.extension.html'"></div>
<nav class="menu slide-menu-left" ng-controller="NavController">
<div class="top clickable" ng-click="navigateToRoot()">
<img id="logo" alt="Logo" src="img/logo.png" />
<h1 class="title">App</h1>
</div>
<ul>
<li ng-class="{active: isActive('control'), hidden: isHidden('control')}">
<a href="#control">
<span class="icon md-icon-dashboard"></span> Control</a>
</li>
<li ng-class="{active: isActive('inbox')}">
<a href="#inbox" class="clickable">
<span class="icon md-icon-add-circle-outline"></span> Inbox
<span ng-show="getNumberOfNewDiscoveryResults() > 0" class="badge">{{getNumberOfNewDiscoveryResults()}}</span>
</a>
</li>
<li ng-class="{active: isActive('configuration'), hidden: isHidden('configuration')}">
<a ng-click="open('configuration')" class="clickable">
<span class="icon md-icon-settings"></span> Configuration</a>
<ul ng-show="isActive('configuration')">
<li ng-class="{active: isSubActive('bindings')}"><a href="#configuration/bindings">Bindings</a></li>
<li ng-class="{active: isSubActive('services')}"><a href="#configuration/services">Services</a></li>
<li ng-class="{active: isSubActive('groups'), hidden: isHidden('groups')}"><a href="#configuration/groups">Groups</a></li>
<li ng-class="{active: isSubActive('things')}"><a href="#configuration/things">Things</a></li>
</ul>
</li>
<li ng-class="{active: isActive('extensions'), hidden: isHidden('extensions')}">
<a href="#extensions">
<span class="icon md-icon-extension"></span>
Extensions</a>
</li>
<li ng-class="{active: isActive('rules'), hidden: isHidden('rules')}">
<a href="#rules">
<span class="icon md-icon-movie-creation"></span>
Rules</a>
</li>
<li ng-class="{active: isActive('preferences'), hidden: isHidden('preferences')}">
<a href="#preferences">
<span class="icon md-icon-brightness-medium"></span>
Preferences</a>
</li>
</ul>
<div class="bottom">
<span>UI</span>
</div>
</nav>
<div id="wrapper">
<header>
<a href="#" class="open-menu">≡</a>
<div class="title">
<h1>
{{title}}
<span ng-repeat="subtitle in subtitles" class="subtitle">
<span class="chevron md-icon-chevron-right"></span> {{subtitle}}</span>
</h1>
</div>
</header>
<ng-view autoscroll="true"></ng-view>
<footer> </footer>
</div>
<!-- lib js files -->
<script src="js/angular.min.js"></script>
<script src="js/angular-bundle.min.js"></script>
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<!-- TODO: Create custom variant to save space -->
<script src="js/tinycolor.js"></script>
<script src="js/masonry.pkgd.min.js"></script>
<!-- TODO: Use angularized version? -->
<script src="js/sprintf.min.js"></script>
<!-- custom js files -->
<script src="js/app.js"></script>
<script src="js/constants.js"></script>
<script src="js/services.min.js"></script>
<script src="js/controllers.min.js"></script>
<script src="js/extensions.js"></script>
<script src="js/main.js"></script>
<script src="js/shared.properties.js"></script>
</body>
</html>
&#13;