欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java filter中的chain.doFilter使用詳解

 更新時(shí)間:2021年11月20日 10:02:38   作者:afaye_  
這篇文章主要介紹了Java filter中的chain.doFilter使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

filter中的chain.doFilter使用

chain.doFilter作用

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

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

2.chain.doFilter將請(qǐng)求轉(zhuǎn)發(fā)給過(guò)濾器鏈下一個(gè)filter , 如果沒有filter那就是你請(qǐng)求的資源

舉例說(shuō)明

1.input.jsp 是用來(lái)提交輸入的 : 當(dāng)提交后,過(guò)濾器檢測(cè)姓名和年齡 .

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

3.在此 , 同時(shí)也有一個(gè)過(guò)濾器,防止亂碼問(wèn)題存在 , 該過(guò)濾器檢測(cè)一個(gè)頁(yè)面是否設(shè)置了字符編碼,如果沒有則進(jìn)行設(shè)置。

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);//到下一個(gè)鏈
    }
    public void init(FilterConfig fConfig) throws ServletException {
        this.config=fConfig;
        encoding=fConfig.getInitParameter("encoding");//獲得目標(biāo)編碼格式
    }
}

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,"用戶名和年齡輸入錯(cuò)誤!");
            dispatch.forward(request, response);
            return;
        }
        else{
            try {
                age1=Integer.parseInt(age);
            }catch(Exception e){
                //JOptionPane.showMessageDialog(null,"年齡必須為數(shù)字!");
                dispatch.forward(request,response);
                return;//如果是錯(cuò)誤頁(yè)面就到erroroutput.jsp中
            }
        }
        //這里表示是正確的,也就是說(shuō),他回去找下一個(gè)鏈,但是它下面已經(jīng)沒有了,所以就會(huì)去跳轉(zhuǎn)頁(yè)面了,此跳轉(zhuǎn)的頁(yè)面就是action="output.jsp"了
        chain.doFilter(request, response);
        }
}

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

在寫代碼中,每次看到Filter(過(guò)濾器)中 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();
   //響應(yīng)體
   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()之前的代碼,一般是對(duì)request執(zhí)行的過(guò)濾操作;

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

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

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java與C++分別用遞歸實(shí)現(xiàn)漢諾塔詳解

    Java與C++分別用遞歸實(shí)現(xiàn)漢諾塔詳解

    漢諾塔問(wèn)題是一個(gè)經(jīng)典的問(wèn)題。漢諾塔(Hanoi Tower),又稱河內(nèi)塔,源于印度一個(gè)古老傳說(shuō)。本文將用Java與C++分別實(shí)現(xiàn),感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • List集合多線程并發(fā)條件下不安全如何解決

    List集合多線程并發(fā)條件下不安全如何解決

    List是我們常用的集合,但是在多線程并發(fā)的條件下,會(huì)出現(xiàn)安全問(wèn)題嗎?下面我們就來(lái)測(cè)試一下,如果出現(xiàn)安全問(wèn)題,該如何解決,感興趣的可以了解一下
    2021-12-12
  • jdbc實(shí)現(xiàn)用戶注冊(cè)功能代碼示例

    jdbc實(shí)現(xiàn)用戶注冊(cè)功能代碼示例

    這篇文章主要介紹了jdbc實(shí)現(xiàn)用戶注冊(cè)功能,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Struts2 使用OGNL遍歷map方法詳解

    Struts2 使用OGNL遍歷map方法詳解

    這篇文章主要介紹了Struts2 使用OGNL遍歷map方法詳解,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09
  • Spring針對(duì)AOP詳細(xì)講解

    Spring針對(duì)AOP詳細(xì)講解

    Spring是一個(gè)廣泛應(yīng)用的框架,SpringAOP則是Spring提供的一個(gè)標(biāo)準(zhǔn)易用的aop框架,依托Spring的IOC容器,提供了極強(qiáng)的AOP擴(kuò)展增強(qiáng)能力,對(duì)項(xiàng)目開發(fā)提供了極大地便利
    2022-06-06
  • JSR303校驗(yàn)注解和自定義校驗(yàn)注解的使用

    JSR303校驗(yàn)注解和自定義校驗(yàn)注解的使用

    這篇文章主要介紹了JSR303校驗(yàn)注解和自定義校驗(yàn)注解的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 詳解Spring 框架中切入點(diǎn) pointcut 表達(dá)式的常用寫法

    詳解Spring 框架中切入點(diǎn) pointcut 表達(dá)式的常用寫法

    這篇文章主要介紹了詳解Spring 框架中切入點(diǎn) pointcut 表達(dá)式的常用寫法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Java Set接口及常用實(shí)現(xiàn)類總結(jié)

    Java Set接口及常用實(shí)現(xiàn)類總結(jié)

    Collection的另一個(gè)子接口就是Set,他并沒有我們List常用,并且自身也沒有一些額外的方法,全是繼承自Collection中的,因此我們還是簡(jiǎn)單總結(jié)一下,包括他的常用實(shí)現(xiàn)類HashSet、LinkedHashSet、TreeSet的總結(jié)
    2023-01-01
  • springboot schedule 解決定時(shí)任務(wù)不執(zhí)行的問(wèn)題

    springboot schedule 解決定時(shí)任務(wù)不執(zhí)行的問(wèn)題

    這篇文章主要介紹了springboot schedule 解決定時(shí)任務(wù)不執(zhí)行的問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 解決java.lang.NullPointerException報(bào)錯(cuò)以及分析出現(xiàn)的幾種原因

    解決java.lang.NullPointerException報(bào)錯(cuò)以及分析出現(xiàn)的幾種原因

    這篇文章介紹了解決java.lang.NullPointerException報(bào)錯(cuò)的方法,以及分析出現(xiàn)的幾種原因。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12

最新評(píng)論