Ⅰ java后台程序怎么用https协议
嗨 你好
据网上了解到:
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。
如果使用了反向代理软件,将:2046/ 的URL反向代理为 / 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或192.168.1.110,而并不是客户端的真实IP。
经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问 /index.jsp/ 时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问:2046/index.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。
于是可得出获得客户端真实IP地址的方法一:
public String getRemortIP(HttpServletRequest request) { if (request.getHeader("x-forwarded-for") == null) { return request.getRemoteAddr(); } return request.getHeader("x-forwarded-for"); }
可是当我访问 /index.jsp/ 时,返回的IP地址始终是unknown,也并不是如上所示的127.0.0.1或192.168.1.110了,而我访问:2046/index.jsp 时,则能返回客户端的真实IP地址,写了个方法去验证。原因出在了Squid上。squid.conf 的配制文件forwarded_for 项默认是为on,如果 forwarded_for 设成了 off 则:X-Forwarded-For: unknown
于是可得出获得客户端真实IP地址的方法二:
public String getIpAddr(HttpServletRequest request) { 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; }
可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串Ip值,究竟哪个才是真正的用户端的真实IP呢?
答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。
如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100用户真实IP为: 192.168.1.110
希望可以帮到你的忙
祝你学习愉快
-
Ⅱ 如何用JAVA实现HTTPS客户端
import java.io.*;
import java.net.*;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.*;
public class TrustSSL {
private static class TrustAnyTrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[] {};
}
}
private static class TrustAnyHostnameVerifier implements HostnameVerifier {
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
public static void main(String[] args) throws Exception {
InputStream in = null;
OutputStream out = null;
byte[] buffer = new byte[4096];
String str_return = "";
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[] { new TrustAnyTrustManager() },
new java.security.SecureRandom());
URL console = new URL(
"https://192.168.1.188/test.php?username=测试");
HttpsURLConnection conn = (HttpsURLConnection) console
.openConnection();
conn.setSSLSocketFactory(sc.getSocketFactory());
conn.setHostnameVerifier(new TrustAnyHostnameVerifier());
conn.connect();
InputStream is = conn.getInputStream();
DataInputStream indata = new DataInputStream(is);
String ret = "";
while (ret != null) {
ret = indata.readLine();
if (ret != null && !ret.trim().equals("")) {
str_return = str_return
+ new String(ret.getBytes("ISO-8859-1"), "GBK");
}
}
conn.disconnect();
} catch (ConnectException e) {
System.out.println("ConnectException");
System.out.println(e);
throw e;
} catch (IOException e) {
System.out.println("IOException");
System.out.println(e);
throw e;
} finally {
try {
in.close();
} catch (Exception e) {
}
try {
out.close();
} catch (Exception e) {
}
}
System.out.println(str_return);
}
}
Ⅲ java爬虫访问https,本地开发是win7系统,可以正常爬到数据,上传到linux服务器不能获取数据,怎么解决
可能是字符串编码问题。
Ⅳ 新站准备上线了,怎么把IP端口访问改成域名呢 需要改成https访问
域名解析的话还是正常解析,在域名管理台把域名解析到指定IP。
https协议则不一样,它是加密连接,需要证书签发机构颁发相应的证书,否则连接不会被浏览器信任,而这种证书每个IP只能签发一个
https的端口和http的不同,是443端口,需要申请SSL证书(收费,免费也有,很少),是SSL+HTTP的,把SSL部署到服务器,做配置就可以了。
Ⅳ java 访问不到本地的proxy
这个是 apache httpclient 的代码
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
new AuthScope("localhost", 8080),
new UsernamePasswordCredentials("username", "password"));
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider).build();
try {
HttpHost target = new HttpHost("www.verisign.com", 443, "https");
HttpHost proxy = new HttpHost("localhost", 8080);
RequestConfig config = RequestConfig.custom()
.setProxy(proxy)
.build();
HttpGet httpget = new HttpGet("/");
httpget.setConfig(config);
System.out.println("Executing request " + httpget.getRequestLine() + " to " + target + " via " + proxy);
CloseableHttpResponse response = httpclient.execute(target, httpget);
try {
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
EntityUtils.consume(response.getEntity());
} finally {
response.close();
}
} finally {
httpclient.close();
}
因为 不给发链接,你去 apache httpcomponents 的网站,找 httpclient ,example 里面都有的
Ⅵ Java 中怎样在程序中设置代理服务器
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.net.Authenticator;
importjava.net.HttpURLConnection;
importjava.net.InetSocketAddress;
importjava.net.PasswordAuthentication;
importjava.net.Proxy;
importjava.net.URL;
publicclassProxyDemo2{
publicstaticvoidmain(String[]args)throwsException{
URLurl=newURL("http://www.3lai8.com");
///创建代理服务器
InetSocketAddressaddr=newInetSocketAddress("192.168.0.254",8080);
//Proxyproxy=newProxy(Proxy.Type.SOCKS,addr);//Socket代理
Proxyproxy=newProxy(Proxy.Type.HTTP,addr);//http代理
Authenticator.setDefault(newMyAuthenticator("username","password"));//设置代理的用户和密码
HttpURLConnectionconnection=(HttpURLConnection)url.openConnection(proxy);//设置代理访问
InputStreamReaderin=newInputStreamReader(connection.getInputStream());
BufferedReaderreader=newBufferedReader(in);
while(true){
Strings=reader.readLine();
if(s!=null){
System.out.println(s);
}
}
}
{
privateStringuser="";
privateStringpassword="";
publicMyAuthenticator(Stringuser,Stringpassword){
this.user=user;
this.password=password;
}
(){
(user,password.toCharArray());
}
}
}
Ⅶ 怎样用apache xampp配置https反向代理
如何开启apache虚拟目录反向代理 现有2个项目,A:php项目,B:java项目。由于域名解析只能使用80端口,因此需要apache来反向代理。apache使用80端口,tomcat使用8080. apache下httpd.conf中开启以下模块: # Virtual hosts 加载虚拟主机功能
Ⅷ 如何更换IP
可以尝试使用代理服务器,以及用浏览器隐藏等方法。以下是我找到的资料,希望能对你有所帮助。
用浏览器隐藏IP地址的方法
代理服务器的一个突出作用就是隐藏本机IP地址。
我们先看看如何知道自己上网时的真实IP地址?
浏览器中先不设置代理服务器,连上Internet网后用下列方法之一获得:
方法1.在屏幕左下部托盘区对网络拨号连接图标(ADSL)点击鼠标右键,选“状态→详细信息→客户IP地址”就悄愕纳贤凫P。
方法2.对MyIE3.2DC浏览器在界面顶部的菜单栏点击“工具”,勾选“显示本机IP地址”。
对TouchNet 1.28 英文版在菜单栏点击“Tools→IP Tools→My IP to Clipboard”。
方法3.在线检测:中国大陆用户:h++p://ip.loveroot.com/
海外地区用户:h++p://216.92.207.177/pr.htm
内网用户由此知道本局域网服务器上网的真实IP。
然后谈如何隐藏本机的真实地址?
方法很多,一个简单的方法就是用浏览器设置代理服务器,即首先关闭浏览器的Java功能;其次浏览器使用合适的代理服务器;最后不要忘了测试。
一、关闭Java程序。
Java Applet是动态运行的一些子程序,一般用于动画和旋转文字,能使网页看起来更生动、漂亮。但是这些程序的运行不仅会大大影响下载速度,而且有安全漏洞。浏览的网站利用Java Applet等程序容易得到你的本机的IP等多项有关个人的信息,这是在你没有选择也没有点击任何东西的情况下进行的。
因此,如果你想隐藏IP,在浏览器中不要打开Java功能,否则连接回到网站服务器的applet子程序会泄露你本机的IP地址。一些普通的免费匿名页面代理,如Anonymizer、Proxymate也不能解决此问题。
下面是部分浏览器禁止运行Java程序的步骤。
IE 6.0 sp1
在界面顶部的菜单栏点击“工具→Internet选项→安全→自定义级别→脚本”,对“Java小程序脚本”选项点选禁用。
MyIE 3.2DC
在界面顶部的菜单栏点击“选项→MyIE选项→下载”,不要勾选“允许Java Applet”。并检查工具栏的图标“下载图片”旁点击按钮,确定没有勾选“允许Java Applet(当前窗口)”。
GreenBrowser 2.2 build 429
在界面顶部的菜单栏点击“工具”→GreenBrowser选项→下载”,不要勾选“允许Java” 。同样在工具栏的图标“显示图片”旁点击按钮,确定没有勾选“允许Java(J)”。
TouchNet 1.28 英文版
在界面顶部的菜单栏点击“Options →TouchNet Options→Download”,勾选“Disable Java” 。
Sleipnir 1.54 汉化版
在界面底部点击“允许/禁止Java”图标,变灰即生效。
Mozilla Firefox 0.8 繁体中文版
在界面顶部的菜单栏点击“工具→选项→网页”,不要勾选“可使用Java”。
当然,为获得较高安全性可以将IE类浏览器ActiveX功能、Java功能和脚本功能全部关闭,将非IE类浏览器Java和Javascript功能关闭,只是这样就限制了许多网站、论坛的功能,网页的特效也不能显示。
二、选用合适的代理。
在浏览器关闭了Java功能的基础上,还要设置代理服务器。
1.选用http代理。应选用匿名代理和加密代理才行。选用匿名代理,对网络服务商ISP(如电信、网通、铁通)来说,知道你去的是代理服务器,对访问的网站来说,他不知道你的真实所在;选用加密代理,即支持SSL的安全代理,连域名和传输内容都加密。只要是用加密代理访问加密网站(形如https://IP或域名),其加密强度无法破解,网络服务商ISP和网关无法知道流经的信息内容,你的数据安全和隐私得到强大的保护。
注意:加密代理可以是透明代理和非匿名代理,但须支持SSL并且访问加密网站才能加密;因验证工具的不同,有的代理分lev1、lev2,属于高度匿名和匿名代理,lev3 多数是匿名,lev3以上的代理属透明代理。
2.选用socks代理,无论是socks 4/4a/5中的任一种,均可隐藏本机的真实IP地址,并且全部支持访问https的加密网站。socks代理不象http代理要区分支持SSL的代理,才能访问加密网站。
有关设置请阅“浏览器的代理功能”。
三、在线测试IP。
完成上述两步,测试是否隐藏了你的IP可到下列网页查看,如果网页不能显示IP(Your Domain name[Real IP]不能显示)或显示的不是你本机真实的IP地址,说明隐藏成功。
测试网页1:h++p://www.stilllistener.com/checkpoint1/Java/
测试网页2:h++p://ipid.shat.net/
需要指出,使用代理服务器可以对你的ISP保留一点隐私
Ⅸ JAVA中如何设置代理服务器,取消代理服务器
在JAVA中怎么设置代理服务器呢,非常简单
publicvoidsetServiceProxy(Configconfig){
this.config=config;
System.setProperty("http.proxyHost",config.getProxyHost());
System.setProperty("http.proxyPort",config.getProxyPort());
System.setProperty("https.proxyHost",config.getProxyHost());
System.setProperty("https.proxyPort",config.getProxyPort());
}
然后在每一个HttpUrlConnection请求中,设置代理服务器用户名和密码,并进行Base64加密(看你代理服务器的要求,可能因代理服务器不同而不同),代码如下
()throwsIOException{
Stringauthorization=config.getProxyUser()+":"
+config.getProxyPassword();
URLurl=newURL(config.getRequestUrl());
HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
conn.setRequestProperty("Proxy-Authorization",
"Basic"+Base64.encodeBase64String(authorization.getBytes()));
returnconn;
}
Ⅹ 创建连接是HttpsURLConnection,怎么设置代理服务器
java设置代理
packagecom.path.test;
importjava.io.BufferedInputStream;
importjava.io.BufferedOutputStream;
importjava.io.FileOutputStream;
importjava.net.URL;
importjava.net.URLConnection;
publicclassTURLConnection{
publicstaticvoidmain(Stringargs[])throwsException
{
//设置代理上外网
System.getProperties().put("proxySet","true");
System.getProperties().put("proxyHost","172.31.170.14");
System.getProperties().put("proxyPort","8080");
/*
如果需要验证用户
//Authenticator.setDefault(newMyAuthenticator());
*/
URLurl=newURL("http://www.csdn.net");
URLConnectionurlCon=url.openConnection();
/*
*方法1,一次过读取所有信息
*/
BufferedInputStreambis=newBufferedInputStream(urlCon.getInputStream());
BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream("C:aa.htm"));
byteb[]=newbyte[bis.available()];
bis.read(b);
bos.write(b);
bos.flush();
bis.close();
bos.close();