好记性不如烂笔头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的方法,但是这种方法不能处理被黑客攻击和修改过后的地址。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。