好记性不如烂笔头6-HttpServletRequest做web请求转发
在很多的WEB场景中,我们需要对请求做转发。
比如某一些系统升级了,但是老用户可能没有条件进行升级,那么还是走原来的途径,但是我们没有必要支撑多种平台,最后还是通过内部转发到新功能模块即可。
请求转发:指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。
1、Servlet中实现请求转发的方式
1、通过ServletContext的getRequestDispatcher(Stringpath)方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。
例如:将请求转发的change.jsp页面
RequestDispatcher reqDispatcher=this.getServletContext().getRequestDispatcher("/change.jsp");
reqDispatcher.forward(request,response);
2、通过request对象提供的getRequestDispatche(Stringpath)方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。
例如:将请求转发的change.jsp页面
request.getRequestDispatcher("/change.jsp").forward(request,response);
一般使用这种方式。
2、实现请求转发的JAVA代码
package com.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/**
*通过request对象获取客户端请求信息,并且进行转发到另外一个页面中
*
*@author 范芳铭
*/
public class RequestDispatcher extendsHttpServlet {
privatestatic final long serialVersionUID = -4150164731865037680L;
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
StringrealIp = this.getRealIp(request);
request.setAttribute("realIp",realIp);
//请求转发到change.jsp
request.getRequestDispatcher("/change.jsp").forward(request,response);
}
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
doGet(request,response);
}
//如果通过代理等方式,IP地址会变化
publicString getRealIp(HttpServletRequest request) {
Stringip = 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();
}
returnip;
}
}
3、change.jsp 源代码
<%@ page language="java"import="java.util.*,javax.servlet.http.*"pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>请求转发</title>
</head>
<body>
得到来访者的IP地址:
<h3style="color:red;"><%=(String)request.getRemoteAddr()%></h3>
你的IP地址是:<%=(String)request.getAttribute("realIp")%>
</body>
</html>
4、Web.xml文件
<?xml version="1.0"encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>request</servlet-name>
<servlet-class>com.servlet.Request</servlet-class>
</servlet>
<servlet>
<servlet-name>change</servlet-name>
<servlet-class>com.servlet.RequestDispatcher</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>change</servlet-name>
<url-pattern>/change</url-pattern>
</servlet-mapping>
</web-app>
5、Java获取IP地址:request.getRemoteAddr()的问题
获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。
如果使用了反向代理软件,用request.getRemoteAddr() 方法获取的IP地址是反向代理软件的地址,而并不是客户端的真实IP。
经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。
因此实现请求转发的JAVA源代码中,
//如果通过代理等方式,IP地址会变化
publicString getRealIp(HttpServletRequest request) {
Stringip = 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();
}
returnip;
}
就是获取真实IP的方法,但是这种方法不能处理被黑客攻击和修改过后的地址。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。