1. 程式人生 > >頁面跳轉與重定向(之二)

頁面跳轉與重定向(之二)

前言

這一篇是接著上一篇的繼續

在上一篇中, 介紹了在html,js 和JSP中如何跳轉和重定向。

基本是在頁面層級進行頁面的跳轉, 進入一個頁面後跳入另一個頁面。

這一篇將從專案和服務端來看看有可能在實際的專案中使用到的狀況。

舊的地址跳轉到新的地址

在系統開發過程中, 新舊系統並存是一種常見的處理方法,新舊系統有著各自獨立的域名地址。 、

當新系統開發完成的時候,就需要把舊地址的域名導到新地址中了。

方法之一 就是進行DNS 修改映射了。

如果系統沒有域名, 只有IP, 或是不想修改DNS 的話, 就可以在舊系統中修改主頁面。最簡單的就是類似:

<TITLE>New System</TITLE>
<META name="description" content="New System Forward">
<META name="keywords" content="New System">
<META name="robots" content="index,follow,all">
<meta http-equiv="refresh" content="0; URL=http://newurl">
當然也可以使用上一篇中提到的其他方式。

Tomcat 中的地址設定

Tomcat 預設安裝的狀況下(port:8080), 專案部署在webapps 目錄下。

舉例: 這裡的域名myweb ,這裡的專案名 myproject ,  

本地的訪問地址就是 :  http://IP:8080/myproject.

域名對映後地址就是: http://myweb:8080/myproject

1.  如何去除埠?

方法一: 在安裝是設定成 80 埠

方法二: 如果已經安裝完成, 可以修改conf\server.xml 的下面配置

修改成 80 就可以了。

這樣就可以通過以下方式訪問了:

http://myweb/myproject

2. 如何去除專案名稱。

最方便的訪問方式應該就是直接輸入 域名就進入了。

http://myweb

方法一: 修改 conf\server.xml 配置

在host 中新增如下Context 的配置:

方法二: 如果不使用方法一的話, 預設狀況上面的地址, 會進入 webapps\ROOT\index.html 這個檔案。

所以使用以上的方法修改這個頁面的跳轉應該就能達到所需要的效果了。

二級域名的重定向

新系統雖然已開發完成, 但是還是想有些舊的模組功能使用舊的系統。

這樣的話, 訪問新系統的某些url 的時候,重定向到舊的頁面地址中去。

以訪問  http://myweb/old 的方式訪問舊的地址(比如舊的地址就是http://www.csdn.net)

方法一:  增加 filter

步驟一: 新增 Filter 的java 檔案, 檔名  UrlRewriteFilter.java, 內容如下

/*
 * @author: oscar999
 * @Date:2014-5-29
 * Copyright (c) oscar999. All rights reserved.
 */
package com.oscar999;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/** <description> 
 *  
 * @see  
 * @see  
 * 
 * @version  0.1,  2014-5-29
 * @author   oscar999 
 * @since    JDK1.5 
 */
public class UrlRewriteFilter implements Filter{

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
			ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest httpRequest = (HttpServletRequest) request;
		HttpServletResponse httpResponse = (HttpServletResponse) response;
		String requestPath = httpRequest.getRequestURI();
		if(requestPath.indexOf("/old")>0)
		{
			//request.getRequestDispatcher("/redirect.html").forward(request, response);
			httpResponse.sendRedirect("http://www.csdn.net"); 
			return;
		}		
		chain.doFilter(request, response);
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
	}

}

步驟二:  在web.xml 中 新增filter 的定義
	<filter>
	      <filter-name>UrlRewriteFilter</filter-name>
	      <filter-class>com.oscar999.UrlRewriteFilter</filter-class>
	</filter>
	<filter-mapping>
	          <filter-name>UrlRewriteFilter</filter-name>
	          <url-pattern>/old</url-pattern>
	</filter-mapping>      

說明:

1. 在Java 中,滿足轉向的狀況, 一定要return 。 否則會報 IllegalStateException錯誤

2. 可以比較一下, forward 和 redirect 的使用差別 ?

 1)  呼叫的物件不同(request , response)

 2)  使用的場景不同(是否是本專案中的檔案)

 3)  url 的地址的變化

3. 轉向的邏輯的可以通過init-param 配置在filter 的 xml 中

	   <init-param>
	       <param-name></param-name>
	        <param-value></param-value>
	    </init-param>  
在filter 的init方法 中,通過 Enumeration<?> e = filterConfig.getInitParameterNames(); 讀到。

這樣的話, 就可以靈活配置轉向的邏輯了。

方法二:  直接使用 urlwrite 元件

其實上面的方式, 已經有共用的元件可以用了。

元件的介紹地址 :

http://tuckey.org/urlrewrite/

目前最新版的下載地址:

也可以到:

下載

有了方法一的介紹, 這個元件的使用就很容易了。

1. 下載jar , 放入專案路徑中

2. 配置 web.xml

<filter>
	         <filter-name>UrlRewriteFilter</filter-name>
	         <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
	</filter>
	<filter-mapping>
	          <filter-name>UrlRewriteFilter</filter-name>
	          <url-pattern>/*</url-pattern>
	</filter-mapping>

3. 在web.xml 的同路徑下,新增 urlrewrite.xml 檔案, 內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<urlrewrite>
    <rule>
        <from>/old</from>
        <to type="redirect">http://www.csdn.net</to>
    </rule>     
</urlrewrite>

這裡可以配置很多的轉向邏輯,不過有上下層級關係時,也就是既有二級域名又有三級域名的話, 配置起來會有一些問題。

不難理解三級在二級的基礎上又換了一次, 導致url 會不對。

另外, 如果專案使用的是 http://myweb/myproject 這種通過專案名訪問的話,

對映舊的地址可以在 tomcat/webapps 中放入一箇舊專案同名的專案,裡面沒什麼內容,專門用來做重定向。