html ,js 能夠實現頁面跳轉。javascript
jsp , asp, php 也有各自頁面跳轉與重定向的方式。php
下文針對js 和jsp 的頁面跳轉實現方式進行一個總結。html
可使用html 的meta 標籤實現頁面的跳轉。java
<!--Add by oscar999--> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE> <META NAME="Author" CONTENT="oscar999"> <meta http-equiv="refresh" content="0; URL=http://www.csdn.net"> <script> </script> </HEAD> <BODY> This is Test Page </BODY> </HTML>
這種用法比較常使用在:web
新舊系統升級的情況下, 暫時保留舊系統,經過域名進入時自動轉到新系統中。瀏覽器
1. 使用window.location = "newurl"tomcat
<!--Add by oscar999--> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE> <META NAME="Author" CONTENT="oscar999"> </HEAD> <BODY> This is Test Page. <script> window.location="http://www.csdn.net"; </script> </BODY> </HTML>
也可使用 window.location.href = "http://www.csdn.net";服務器
2. 使用 window.navigate併發
<script> window.navigate("http://www.csdn.net"); </script>
3. window.loction.replace方式實現頁面跳轉app
<script language="javascript"> window.location.replace("target.aspx"); </script>
有3個jsp頁面(1.aspx, 2.aspx, 3.aspx),進系統默認的是1.aspx,當我進入2.aspx的時候, 2.aspx裏面用window.location.replace("3.aspx");
與用window.location.href ("3.aspx");
從用戶界面來看是沒有什麼區別的,可是當3.aspx頁面有一個"返回"按鈕,調用window.history.go(-1); wondow.history.back();方法的時候,一點這個返回按鈕就要返回2.aspx頁面的話,區別就出來了,當用 window.location.replace("3.aspx");連到3.aspx頁面的話,3.aspx頁面中的調用 window.history.go(-1);wondow.history.back();方法是很差用的,會返回到1.aspx。
JSP 跳轉方式大約有三種:
1. response.sendRedirect(「newurl」);
-- 此語句前不容許有out.flush(),若是有,會有異常:
java.lang.IllegalStateException: Can't sendRedirect() after data has committed to the client.
at com.caucho.server.connection.AbstractHttpResponse.sendRedirect(AbstractHttpResponse.java:558)
--跳轉後瀏覽器地址欄變化
--若是要跳到不一樣主機下,跳轉後,此語句後面的語句會繼續執行,如同新開了線程,可是對response的操做已經無心義了
若是要跳到相同主機下,此語句後面的語句執行完成後纔會跳轉;
2. response.setHeader("Location","newurl");
response.setStatus(302);
response.setHeader("location","newurl");
這種使用方式要結合 setStatus(302), 302 這個狀態碼就是告訴瀏覽器要重定向了。
3. <jsp:forward page="newurl" />
此語句前不容許有out.flush(),若是有,會有異常:
跳轉後瀏覽器地址欄不變,可是隻能跳到當前主機下
此語句後面的語句執行完成後纔會跳轉
跳轉後得路徑變爲當前路徑,圖片不是絕對路徑將沒法顯示
例子:
整個簡單的例子: 兩個文件 a.jsp 和 b.jsp .
<!-- by oscar999 --> <!-- This is a.jsp --> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> Before: This is a.jsp! <br> <% //response.sendRedirect("b.jsp"); //response.setStatus(302); //response.setHeader("location","b.jsp"); %> <jsp:forward page="b.jsp"/> After: This is a.jsp! </body> </html>
對於jsp 而言, 就須要嚼一嚼Redirect 和 forward 的差異了。
就字面意思而已: Redirect 翻譯成重定向, forward翻譯成轉發。
二者的區別是:
重定向是客戶端行爲,轉發是服務器行爲
重定向過程:客戶瀏覽器發送http請求——》web服務器接受後發送302狀態碼響應及對應新的location給客戶瀏覽器——》客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location地址——》服務器根據此請求尋找資源併發送給客戶。在這裏location能夠重定向到任意URL,既然是瀏覽器從新發出了請求,則就沒有什麼request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶能夠觀察到地址的變化的。重定向行爲是瀏覽器作了至少兩次的訪問請求的。
轉發過程:客戶瀏覽器發送http請求——》web服務器接受此請求——》調用內部的一個方法在容器內部完成請求處理和轉發動做——》將目標資源發送給客戶;在這裏,轉發的路徑必須是同一個web容器下的url,其不能轉向到其餘的web路徑上去,中間傳遞的是本身的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感受不到服務器作了轉發的。轉發行爲是瀏覽器只作了一次訪問請求。
類別
|
概念
|
共享數據
|
應用
|
Redirect
|
URL從新定向:能夠是任意的URL
|
不能共享request裏面的數據
|
通常用於用戶註銷登陸時返回主頁面和跳轉到其它的網站等等
|
Forward
|
頁面的轉發:只能是同一個Web應用程序的其餘Web組件
|
轉發頁面和轉發到的頁面能夠共性request裏面的數據
|
通常用於用戶登陸的時候根據角色轉發到相應的模塊等等
|
有個例子說明二者的區別很生動:
假設你去辦理某個執照
重定向:你先去了A局,A局的人說:「這個事情不歸咱們管,去B局」,而後,你就從A退了出來,本身乘車去了B局。
轉發:你先去了A局,A局看了之後,知道這個事情其實應該B局來管,可是他沒有把你退回來,而是讓你坐一下子,本身到後面辦公室聯繫了B的人,讓他們辦好後,送了過來。
以上基本是在頁面層級進行頁面的跳轉, 進入一個頁面後跳入另外一個頁面;
下面從項目和服務端來看看有可能在實際的項目中使用到的情況:
在系統開發過程當中, 新舊系統並存是一種常見的處理方法,新舊系統有着各自獨立的域名地址。 、
當新系統開發完成的時候,就須要把舊地址的域名導到新地址中了。
方法之一 就是進行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 默認安裝的情況下(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, 內容以下
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
也能夠到:
下載
有了方法一的介紹, 這個組件的使用就很容易了。
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 中放入一箇舊項目同名的項目,裏面沒什麼內容,專門用來作重定向。