java的servlet 不通过request能获取到服务器IP与提供的端口号吗。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的servlet 不通过request能获取到服务器IP与提供的端口号吗。相关的知识,希望对你有一定的参考价值。
在程序里要使用IP与端口,但是发现除了request里有相应API,没有其它方法获取IP与端口了,我想一个servlet既然初始化完成了,那么即使没有request也应该知道自己提供服务的IP与端口吧?请高手指教。
遍历servlet中的所有内容,怎么做?
1:通过java的servlet获取IP:
public String getRemoteAddress(HttpServletRequest request)
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown"))
ip = request.getRemoteAddr();
return ip;
如果是用反向代理技术的话request.getHeader("x-forwarded-for");会有值,
一般情况下,只要request.getRemoteAddr();就可以了。
2:获取MAC:
public String getMACAddress(String ip)
String str = "";
String macAddress = "";
try
Process p = Runtime.getRuntime().exec("nbtstat -a " + ip);
InputStreamReader ir = new InputStreamReader(p.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
for (int i = 1; i < 100; i++)
str = input.readLine();
if (str != null)
//if (str.indexOf("MAC Address") > 1)
if (str.indexOf("MAC") > 1)
macAddress = str.substring(
str.indexOf("=") + 2, str.length());
break;
catch (IOException e)
e.printStackTrace(System.out);
return macAddress;
通过命令nbtstat -a ip来获得该ip相对应的mac地址。 参考技术A request是由servlet容器管理的,能够获取相应的IP和port,当然你也可以便利servlet中所有的内容,然后查找相应的IP和port,或者截取请求而的header,根据get还是post获取到IP信息追问
遍历servlet中的所有内容,怎么做?
追答ServletContext servletContext=getServletContext().getAttributeNames();返回的是一个枚举,你对这个枚举进行操作
追问返回的是weblogic.utils.enumerations.IteratorEnumerator类型的。只有两个可以用的方法:hasMoreElements,nextElement。怎么用啊。?
追答晕倒,
while(hasMoreElements)
Object o=nextElement;
然后处理这个o,你查卡API吧
.int getRemotePort():获取客户端的主机端口
.String getServerName():获取服务器的名字。
希望对你有所帮助。
仅供参考!
java之servlet学习基础
上一次写到Servlet的实现方法,主要还是通过继承HttpServlet来实现Servlet。下面主要是回顾一下HttpServletRequest和HttpServletResponse对象中的一些方法。因为Web服务器收到客户端的http请求,会针对每一次请求创建一个用于代表请求的request的对象,和代表响应的response对象。
1.HttpServletResponse
设置响应状态码:setStatus(int )
请求重定向:sendRedirect(String location)
设置响应消息头:setHeader(String name, String value)
eg, response.setHeader("content-type","text/html;charset=UTF-8")
告知浏览器使用什么码表,即让浏览器用UTF-8来解析返回的数据
设置服务器端编码:setCharacterEncoding(String charset)
eg, response.setCharacterEncoding("UTF-8");
告知服务器(servlet)用UTF-8来转码,而不是用ISO-8859-1(服务器端默认编码)
设置客户端和服务器端编码:setContentType(String charset)
setHeader和setCharacterEncoding的优化,同时告诉客户端和服务器端使用什么格式的编码。
获得字符输出流:getWrite()
获得字节输出流:getOutputStream()//注意编码
2.HttpServletRequest
获得请求方式:getMethod();//post or get
获得客户端发出请求时完整的url:getRequestURL();
获得请求行中的uri:getRequestURI();
获得当前应用的虚拟目录:getContextPath();
获得请求行中的参数部分:getQueryString();
根据请求消息头的名称获得其对应的值:getHeader(String name);
以下是关于请求正文方面的方法,比较重要
<input type="text" name="username"/>
getParameter(String name);根据表单中name属性的名,获取value值
getParameterValues(String name)为复选框提供的获得值得方法
getParameterNames();获取表单提交的所有name名称
getParameterMap();得到表单提交的所有的键值
因为request也是一个域对象,所以有以下方法
setAttribute(String name, Object value);
getAttribute(String name);
removeAttribute(String name);
请求转发相关:(注意:请求转发不能转发到其他路径,必须是本项目之下的,而重定向可以到其他路径)
getRequestDispatcher(String path)//获得一个RequestDispatcher对象
forword(ServletRequest , ServletResponse )//转发
include(ServletRequest , ServletResponse )//请求包含
解决post方式编码问题:
request.setCharacterEncoding("UTF-8");//告诉服务器要使用什么编码,注:浏览器是用什么编码传到服务器端就是什么编码
解决get方式编码问题:
byte b[] = name.getBytes("ISO-8859-1");//1010101
String name = new String(b,"UTF-8");//解决
即:String name = new String(name.getBytes("ISO-8859-1"),"UTF-8");
以下回顾Cookie和Session。
3.Cookie
cookie是servlet发送到web浏览器的少量信息,这些信息由浏览器保存,然后发送回服务器。cookie的值可以唯一的标识客户端。因此,cookie常用于会话管理。一个cookie拥有一个键、值和一些可选属性(注释,路径,域限定符、版本号)。Servlet通过视同HttpServletResponse的addCookie方法,将创建的cookie发送到客户端浏览器,该方法将字段添加到HTTP响应头,以便于一次一个地将cookie发送到浏览器。而客户端浏览器通过向HTTP响应头添加字段将cookie返回给服务器端(即servlet),可使用HttpServletRequest的getCookie方法从请求中获取cookie。注意,一些cookie可能有相同的键,但却有不同的路径属性。
属性:
(1)name:相当于键。名称不能唯一确定一个Cookie。因为cookie的路径可能不同。
(2)value:值。
(3)path:默认值是写cookie所在的应用程序的访问路径。(客户端在访问服务器资源时,根据访问的路径决定是否带着cookie到服务器,如果访问的路径是以cookie所在的path,就带着cookie,否则不带)。
(4)maxAge:cookie的缓存时间。默认-1(存在浏览器的内存中)。通过setMaxAge(int )来设置缓存时间。(可实现记住用户的功能)
负数:cookie的数据存在浏览器缓存中
0:删除。
整数:缓存到磁盘上的时间。(单位s)
4.Session
session也是一个域对象。(目前已知的域对象:ServletContext,request,Session)。sesseion可以使处在同一个会话下的应用共享数据。cookie是客户端技术,只能存字符串。HttpSession是服务器端技术,可以存对象。
通过getSession()获得Session对象。
HttpSession request.getSession()内部执行原理:
(1)获取名称为JSESSIONID的cookie的值。(session是依赖于cookie的)
(2)如果没有这样的cookie,就创建一个新的httpsession对象,并分配一个唯一的SessionID,并向客户端返回一个键值为JSESSIONID=SessionID的cookie。
(3)如果有这样的cookie,获取cookie的值(即HttpSession对象的值),从服务器内存中根据ID找到HttpSession对象。
找到了:取出来继续服务。
找不到:从(2)开始。
方法:
setAttribute(String )
getAttribute(String )
以上是关于java的servlet 不通过request能获取到服务器IP与提供的端口号吗。的主要内容,如果未能解决你的问题,请参考以下文章
java的servlet类中如何实例化一个request对象