开发者社区> sp42> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

JSP 页面地址小解

简介: HttpServletRequest API 提供了若干方法返回地址信息,使得我们可以了解请求信息如何。我们逐一看看哪些是需要的。 方法名:返回值 含义 getScheme():String 返回请求协议,如 http or https getServerName():String 返回服务器名称,即主机名,可能是 ip 或域名 getServerPort():int 返回请求服务器的端口 由此,我们可以给出一方法,得出请求地址的前缀。
+关注继续查看

HttpServletRequest API 提供了若干方法返回地址信息,使得我们可以了解请求信息如何。我们逐一看看哪些是需要的。

方法名:返回值 含义
getScheme():String 返回请求协议,如 http or https
getServerName():String 返回服务器名称,即主机名,可能是 ip 或域名
getServerPort():int 返回请求服务器的端口
由此,我们可以给出一方法,得出请求地址的前缀。
/**
 * 网站域名=协议+主机名+端口(如果为 80 端口的话就默认不写 80)
 * 
 * @return 网站名称
 */
public String getServerPath() {
	String prefix = getScheme() + "://" + getServerName();

	int port = getServerPort();
	if (port != 80)
		prefix += ":" + port;

	return prefix;
}

方法内默认 this 对象为 HttpServletRequest 类型,下面相同。

不过这个方法是不完整的,只是得到完整 url 的前缀。怎么获取完整的前缀呢?我们可以通过 getRequestURI()、getQueryString() 返回网址剩余部分。

/**
 * 获取本页 URL,有时可能要对 url redirectUri = java.net.URLEncoder.encode(redirectUri, "utf-8");
 * 
 * @param isFull
 *            是否把 QueryString 参数都带进去?
 * @return 本页地址
 */
public String getCurrentPageUrl(boolean isFull) {
	String url = getServerPath() + getRequestURI();
	if (isFull)
		url += '?' + getQueryString();
	return url;
}

有时候我们只是需要网站名称和项目所在名称,两者一起——这时候 getContextPath() 方法就派上用场了,它的作用是返回当前项目的目录名。

/**
 * 网站域名+项目目录
 * 
 * @return 比较完整的 url 但不是最完整的,最完整的见上个方法
 */
public String getBasePath() {
	return getServerPath() + getContextPath();
}

不知道大家还记得微软 ASP 时代的 Server.Mappath 方法吗?它可以把指定的路径影射到服务器上相应的物理路径上,非常有用。现在我们在 JSP 上也弄一个。

/**
 * 输入一个相对地址,补充成为绝对地址 相对地址转换为绝对地址,并转换斜杠
 * 
 * @param relativePath
 *            相对地址
 * @return 绝对地址
 */
public String Mappath(String relativePath) {
	String absolute = getServletContext().getRealPath(relativePath); // 绝对地址
	
	if (absolute != null)
		absolute = absolute.replace('\\', '/');
	return absolute;
}

在写 Servlet MVC 的时候(request.getRequestDispatcher(path).forward(request, response)),JSP 模版虽然可以得到 request 等的对象,但是某些属性还是以 JSP 模板路径为准的,并不是 Servlet 请求的路径。为此,我们可以通过获取 JSP 变量 javax.servlet.forward.request_uri 得到真实的请求路径。

/**
 * 获取原请求的 uri,而非模版所在的 uri
 */
@Override
public String getRequestURI() {
	Object obj = getAttribute("javax.servlet.forward.request_uri");

	if (obj != null && !StringUtil.isEmptyString((String) obj)) {
		return (String) obj;
	} else {
		return super.getRequestURI();// 直接 jsp 的
	}
}

获取请求者 ip 则是如下。

/**
 * 获取请求的 IP 地址

 * @return IP 地址
 */
public String getIP() {
	String s = getHeader("X-Forwarded-For"), unknown = "unknown";
	if (StringUtil.isEmptyString(s) || unknown.equalsIgnoreCase(s))
		s = getHeader("Proxy-Client-IP");
	if (StringUtil.isEmptyString(s) || unknown.equalsIgnoreCase(s))
		s = getHeader("WL-Proxy-Client-IP");
	if (StringUtil.isEmptyString(s) || unknown.equalsIgnoreCase(s))
		s = getHeader("HTTP_CLIENT_IP");
	if (StringUtil.isEmptyString(s) || unknown.equalsIgnoreCase(s))
		s = getHeader("HTTP_X_FORWARDED_FOR");
	if (StringUtil.isEmptyString(s) || unknown.equalsIgnoreCase(s))
		s = getRemoteAddr();

	return s;
}

需要注意的是,本文虽然说的在 JSP 环境下,但实际上在 Servlet 里面仍然通用。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
strus2中页面的s标签,替换jsp的el和jstl标签
strus2中页面的s标签,替换jsp的el和jstl标签
0 0
JSP脚本语法,第一个jsp程序案例,jsp页面脚本、指令、动作
JSP脚本语法,第一个jsp程序案例,jsp页面脚本、指令、动作
0 0
实战:第十四章:Springboot集成jsp页面报404四种解决方案
实战:第十四章:Springboot集成jsp页面报404四种解决方案
0 0
jsp表单处理页面点击量统计
jsp表单处理页面点击量统计
0 0
jsp页面 上传图片预览 的处理
jsp页面 上传图片预览 的处理
0 0
jsp页面出现异常
这样的错误,就应该把把包含页面与被包含页面的@page指令里面的contentType写成一致,一定要一致
0 0
SAP Commerce Cloud Accelerator Checkout Delivery Mode 选择页面的实现 JSP
SAP Commerce Cloud Accelerator Checkout Delivery Mode 选择页面的实现 JSP
0 0
jsp页面编程时的路径问题(绝对路径与相对路径)
浅谈在进行jsp页面编程时,路径问题的解决(绝对路径与相对路径)
0 0
关于日期的处理方法(JSP页面和JSON数据格式)
JSON数据格式的处理格式:(这里我用的是PostMan进行测试数据)
0 0
SpringBoot2.x系列教程09--SpringBoot中支持jsp页面
前言 在上一章节中,壹哥 跟大家讲过现在项目比较流行的开发模式,稍微大点的项目一般都是采用前后端分离的开发模式。如果我们的项目采用的是前后端不分离的模式,在SpringBoot中推荐我们使用Themeleaf模板来作为页面。 但是咱们都知道,Spring MVC中是支持JSP的,但是在Spring Boot中,其实不建议我们使用JSP。因为SpringBoot自带的嵌入式servlet容器对jsp的解析有使用限制,而且jsp的本质是Servlet,每个页面的加载都需要先进行编译,所以jsp的效率相对于html或Themeleaf都比较低。 但是如果你非要在Spring Boot中使用jsp
0 0
+关注
sp42
移动项目技术负责人。多年全栈经验,熟悉 Java 和 JS,CSDN 博客技术专家,著有《ExtJS 详解与实践》等书。
文章
问答
文章排行榜
最热
最新
相关课程
更多
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载