怎麼在Filter中使用HTTPServletRequest

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  HttpServletRequest req = (HttpServletRequest) request;
  HttpServletResponse resp = (HttpServletResponse) response;

  }web

    由於要用到HttpServletRequest中的方法,我對ServletRequest進行了強轉,而後問題解決。但是後來一想不對啊,咱們知道我 們對子類實現進行向上轉型獲得父類對象是安全的,由於子類會徹底繼承父類的方法,咱們向上轉型爲父類,當咱們調用父類的方法其實在子類實現中是能徹底找到 的。反之向下轉型是不安全的,咱們子類除了徹底繼承父類的方法外還會拓展本身的方法,因此咱們在調用子類方法時可能在父類實現中是找不到的,因此向下轉型 不安全。安全

   但是本例中的實現卻讓咱們困惑,咱們不只實現了向下轉型,同時還調用了子類拓展的方法,是父類沒有的,但是卻實現了。這不是和咱們所學矛盾嗎?後來看了API和一些資料我終於明白了,這和咱們所學其實並不衝突!咱們先看API:測試

   public interface HttpServletRequest extends ServletRequestspa

   終於找到緣由了,原來HttpServletRequest和ServletRequest都是接口,他們都只是定義了方法卻沒有提供相關實現。因此咱們看到的ServletRequest request中的request對象其實並非咱們ServletRequest 的一個具體實現。對象

   這裏咱們要看咱們提出的問題是否安全,其實主要看request 對象的具體實現類到底是繼承的哪一個接口,若是繼承自HttpServletRequest接口那麼咱們向下轉型使用HttpServletRequest接口的方法就是安全的。測試以下:繼承

    if(request instanceof HttpServletRequest){
        System.out.println("我是右邊類的實例");
    }接口

   輸出:我是右邊類的實例,證實咱們的request對象的確是HttpServletRequest的一個實例。ci

   疑問解決。it

相關文章
相關標籤/搜索