1. 程式人生 > >在Filter過濾器中使用req.getPathInfo方法的返回值問題

在Filter過濾器中使用req.getPathInfo方法的返回值問題

    請求URL1 :    http://localhost/text/servlet/1
    請求URL2 :    http://localhost/text/sert/1
    請求URL3 :    http://localhost/text/servlet
    Filter路徑 :  /*
    Servlet路徑:  /servlet/*
    
    一、請求URL1
    
    URL1不是專案存在的實際目錄,伺服器提交往Servlet和Servlet互動,此時請求會被Filter攔截,當我們在
    Filter中呼叫請求物件的request.getPathInfo()方法時,會返回 1 ;
         

    二、請求URL2
    
    此時的URL2路徑也會被提交往Servlet同時也被Filter攔截,我們在Filter中開始掉request.getPathInfo()方法,
    返回值將會是 null
    
    
    出現上述情況的根本原因在於,就算URL遭到了Filter的攔截,同時Filter也作用在Servlet之前,但當我們
    在Filter裡面呼叫request的getPathInfo()方法時,方法的返回值本質還是返回請求URL相對於對應Servlet的
    路徑的相對路徑,類比情況一。要注意的是,當請求URL找不到與之對應得Servlet的時候,自然也就沒有了相對
    的參考點,自然也就不存在著相對路徑,返回值就會是Null,類比情況二。
    儘管是在Filter中呼叫請求物件的getPathInfo()方法也儘管Filter執行在Servlet前,但是該方法的返回值和
    Filter無關,也和Filter的路徑無關。只和存不存在對應的Servlet有關。

    
    
    三、請求URL3
    提交請求URL3,此時有Servlet與之對應,能夠進入Servlet,但是他們的地址目錄一樣,相對地址為空,所有
    getPathInfo()方法也返回Null;
    
    
    
    
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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebFilter("/*")
public class TestFilter implements Filter {

   
    public TestFilter() {
   
    }

    public void destroy() {
    
    }

    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException {
        HttpServletRequest    req=(HttpServletRequest)request;
        HttpServletResponse resp=(HttpServletResponse)response;
        System.out.println("過濾器中的PathInfo:"+req.getPathInfo());
        chain.doFilter(req, resp);
    }

    
    public void init(FilterConfig fConfig) throws ServletException {
    
    }

}
    
    
    
    
    
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name="text",urlPatterns={"/servlet/*"})
public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    
        System.out.println("Servlet中的PathInfo:"+req.getPathInfo());
        
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
        this.doGet(req, resp);
    }

相關推薦

JDBC的executeBatch方法返回-2

executeBatch方法是提交批處理的命令,返回一個整形陣列int[],陣列中的每個數字對應一條命令的影響行數,在Oracle的驅動中沒有實現該功能,即提交成功後不能返回影響行數,所以返回-2。 在JDBC的規範中Statement.SUCCESS_NO_INFO(-2

Filter過濾器使用req.getPathInfo方法返回問題

    請求URL1 :    http://localhost/text/servlet/1     請求URL2 :    http://localhost/text/sert/1     請求URL3 :    http://localhost/text/servlet     Filter路徑 : 

Java 帶參帶返回方法的使用

public java public class mains { public static void main(String[] args) { mains hello = new mains(); int[] scores={79,52,98,81}; hello.sort(sc

struts2在配置文件調用Action的方法返回

ack 文件下載 返回 public class int cat chm webex struts2在配置文件中可以調用Action的方法返回值 1.Action中 //文件下載名 public String getDownloadFileName(){

java方法返回前的<T>的作用

方法返回值前的<T>的左右是告訴編譯器,當前的方法的值傳入型別可以和類初始化的泛型類不同,也就是該方法的泛型類可以自定義,不需要跟類初始化的泛型類相同 我們通過一段程式碼比較來看下就明白了  class Show<T> { public void p

java方法返回前的的作用

方法返回值前的<T>的左右是告訴編譯器,當前的方法的值傳入型別可以和類初始化的泛型類不同,也就是該方法的泛型類可以自定義,不需要跟類初始化的泛型類相同 我們通過一段程式碼比較來看下就明白了  class Show<T> { public vo

Controller方法返回其他型別需要新增jackson依賴

    第一個 第二個:    第三個         https://www.cnblogs.com/codejackanapes/p/5569013.html:json的部落格園 spri

Controller方法返回其他類型需要添加jackson依賴

nap nbsp cnblogs alt 軟件 org codehaus blog 分享圖片 第一個 第二個: 第三個 https://www.cnblogs.com/codejackanapes/p/5569013.html:json

ServiceonStartCommand方法返回的探索

前言 onStartCommand方法的返回值 有4種:START_STICKY、START_NOT_STICKY、START_REDELIVER_INTENT、START_STICKY_COMPATIBILITY。 下面通過結合demo測試結果來

######springmvc方法返回為String時@responseBody不能返回json物件。

引用 2 樓 tzdwsy 的回覆: RequestMappingR中加上produces=“application/json”試試 這樣寫只是返回前臺後不報錯,但是資料格式依然不是json的,它只是在返回的資料上打了個引號;“channelId=2” 真正的解決方法應該是這樣的

Java,String類的compareTo()方法返回是什麼

compareTo()的返回值是int,先比較對應字元的ASCII碼,如字串的某字元與引數的某字元不等,則結束比較,返回它們ASCII碼的差值。直至字串的字元 或 引數的字元 有一方全比較完,此時比較字串的長度差並返回。  例:    String s1 = "abc"; 

Android onTouchEvent事件onTouch方法返回詳解

1、 若return false說明沒有成功執行onTouch事件,在執行完onTouch裡面的程式碼之後,onTouch事件並沒有結束。因此某些元件如Gallery會自動執行它所在view裡on

javaread()方法返回解釋

最近做作業,讀取大資料集,然後做處理分析的專案。當我用fileinputstream流讀取檔案的時候,然後用fileinputstream.read()方法讀取檔案的時候,當我檢視API的時候,發現re

java 程式設計下 IO 的輸入流的 read() 方法返回為什麼是 int

Java 下 IO 中 FileReder 和 FileInputStream 分別是以字元和位元組的形式來完成資料的讀取的,然而返回值確是 int 型別的資料,這樣做的核心目的只是要取到到一個 int 型別下的 -1 來表示資料流的末尾。為什麼要這樣做?又是怎麼實現的呢?首

springmvc Controller方法返回

response ping resp log mod for iter 頁面 轉發 1.1返回ModelAndView 不建議使用 1.2返回String 建議使用 @RequestMapping("updateItem") public String updat

java方法返回的變量類型困惑

tail 方法 .com color conf 類型 log content font 一、java program progress of excuting:show in next picture How about the java virt

<筆記>TP5的save方法返回

ima 技術分享 而不是 改變 更新失敗 img 技術 blog src 用save方法來更新數據時,若更新前後數據沒有改變則返回0,更新成功返回影響行數,更新失敗返回false 若想要數據沒改變時提示修改成功,則需要嚴格判斷 if(結果!==false){提示成功}而不是

處理方法返回

aaaaa rst ret blog pan hash res hashmap string 1.Object @RequestMapping("/first") @ResponseBody public Object doOne(){ retur

Object處理方法返回

$.ajax adduser str html rop ctr inf ext rec 創建一個User實體類,並在其中寫上屬性值,並將其進行封裝: public class User { private String name; private int a

重載&方法返回

重載 方法返回值 方法重載: 方法名稱一致,方法的參數類型和個數不一致,就是方法的重載。 就好比在香港買東西一樣,它的方法名是購買,你傳遞給方法的是人民幣類型的參數值,則調用人民幣的購買方法,你傳遞給方法的是美元類型的參數值,就調用美元的購買方法。方法名一致參數不一致,就像是一個方法有了多種模式。