使用java中的自定义反向代理控制器重定向http请求

时间:2016-03-01 20:01:02

标签: java angularjs controller client-server reverse-proxy

我想根据客户端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

给出内部服务器的ipaddress
public 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">&#x2261;</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;
&#13;
&#13;

0 个答案:

没有答案