首页 > 代码库 > 页面跳转与重定向(之二)

页面跳转与重定向(之二)

前言

这一篇是接着上一篇的继续

页面跳转与重定向(之一)

在上一篇中, 介绍了在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/

目前最新版的下载地址:

http://urlrewritefilter.googlecode.com/files/urlrewritefilter-4.0.3.jar

也可以到:

https://onedrive.live.com/redir?resid=5B4EDBCD9EF1AB6B!192&authkey=!AI-dKU740gOo29I&ithint=file%2c.jar 

下载


有了方法一的介绍, 这个组件的使用就很容易了。

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 中放入一个旧项目同名的项目,里面没什么内容,专门用来做重定向。