溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java filter中的chain.doFilter使用是怎樣的

發(fā)布時間:2021-11-20 14:24:09 來源:億速云 閱讀:128 作者:柒染 欄目:開發(fā)技術

Java filter中的chain.doFilter使用是怎樣的,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

filter中的chain.doFilter使用

chain.doFilter作用

1.一般filter都是一個鏈,web.xml 里面配置了幾個就有幾個。一個一個的連在一起

request -> filter1 -> filter2 ->filter3 -> …. -> request resource.

2.chain.doFilter將請求轉發(fā)給過濾器鏈下一個filter , 如果沒有filter那就是你請求的資源

舉例說明

1.input.jsp 是用來提交輸入的 : 當提交后,過濾器檢測姓名和年齡 .

2.如果正常的話會提交給output.jsp 如果不正常提交給erroroutput.jsp.

3.在此 , 同時也有一個過濾器,防止亂碼問題存在 , 該過濾器檢測一個頁面是否設置了字符編碼,如果沒有則進行設置。

1.input.jsp

<form action="output.jsp" name="form" method="post">
    <table>
        <tr>
            <td>name</td>
            <td><input type="text" name="name" /></td>
        </tr>
        <tr>
            <td>age</td>
            <td><input type="text" name="age"/></td>
        </tr>
        <tr>
            <td><input type="submit" name="ok" value="ok"/></td>
        </tr>
    </table>
</form>

2.web.xml

<filter>
    <description></description>
    <display-name>encodefilter</display-name>
    <filter-name>encodefilter</filter-name>
    <filter-class>servletbean.encodefilter</filter-class>
    <init-param>
           <param-name>encoding</param-name>
           <param-value>GB2312</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodefilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
    <description></description>
    <display-name>myfilter</display-name>
    <filter-name>myfilter</filter-name>
    <filter-class>servletbean.myfilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>myfilter</filter-name>
    <url-pattern>/output.jsp</url-pattern>
</filter-mapping>

3.encodefilter.java

package servletbean;
public class encodefilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        if(request.getCharacterEncoding()==null) {
            System.out.println(encoding);
            request.setCharacterEncoding(encoding);
        }
        chain.doFilter(request, response);//到下一個鏈
    }
    public void init(FilterConfig fConfig) throws ServletException {
        this.config=fConfig;
        encoding=fConfig.getInitParameter("encoding");//獲得目標編碼格式
    }
}

3.myfilter.java

package servletbean;
import javax.swing.JOptionPane;
public class myfilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        response.setContentType("text/html");
        response.setCharacterEncoding("GB2312");
        PrintWriter out=response.getWriter();
        String name="";
        String age="";
        int age1;
        name=request.getParameter("name");
        age=request.getParameter("age");
        RequestDispatcher dispatch=request.getRequestDispatcher("erroroutput.jsp");
        if(name==null||name==""||name==" "||age==null) {
            JOptionPane.showMessageDialog(null,"用戶名和年齡輸入錯誤!");
            dispatch.forward(request, response);
            return;
        }
        else{
            try {
                age1=Integer.parseInt(age);
            }catch(Exception e){
                //JOptionPane.showMessageDialog(null,"年齡必須為數(shù)字!");
                dispatch.forward(request,response);
                return;//如果是錯誤頁面就到erroroutput.jsp中
            }
        }
        //這里表示是正確的,也就是說,他回去找下一個鏈,但是它下面已經(jīng)沒有了,所以就會去跳轉頁面了,此跳轉的頁面就是action="output.jsp"了
        chain.doFilter(request, response);
        }
}

Filter中chain.doFilter(req, res)的理解

在寫代碼中,每次看到Filter(過濾器)中 chain.doFilter(req, res);都不懂為什么要加這一句,他的作用是什么;

代碼下面也有:

@Override
 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  ContentCachingRequestWrapper  req=new ContentCachingRequestWrapper((HttpServletRequest) request);
  ContentCachingResponseWrapper res=new ContentCachingResponseWrapper((HttpServletResponse) response);
  long startTime = System.currentTimeMillis();
  String serverUrl = req.getServletPath();
  //不懂這句什么意思  
  chain.doFilter(req, res);  
  long endTime = System.currentTimeMillis();
  try {
   int status = res.getStatus();
   String charset=res.getCharacterEncoding();
   //響應體
   String responsePayload = getPayLoad(res.getContentAsByteArray(),res.getCharacterEncoding());
   res.copyBodyToResponse();
   if(writeLogService==null) {
    writeLogService = (WriteLogService) ServiceLocator.getInstance().getCtx().getBean("writeLogServiceImpl");
   } 
 writeLogService.writeLog(startTime,endTime,serverUrl,postparams,status,responsePayload,charset);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

用法

在doFilter()方法中,在chain.doFilter()之前的代碼,一般是對request執(zhí)行的過濾操作;

在chain.doFilter()后面的代碼,一般是對response執(zhí)行的操作;

chain.doFiter()執(zhí)行下一個過濾器或者業(yè)務處理器。

如果在doFilter()方法中,不寫chain.doFilter(),業(yè)務無法繼續(xù)往下處理;

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI