Tomcat中怎么設(shè)置編碼Filter

本篇文章給大家分享的是有關(guān)Tomcat中怎么設(shè)置編碼Filter,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

專業(yè)從事網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì),高端網(wǎng)站制作設(shè)計(jì),小程序制作,網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團(tuán)隊(duì)竭力真誠服務(wù),采用H5建站+CSS3前端渲染技術(shù),成都響應(yīng)式網(wǎng)站建設(shè)公司,讓網(wǎng)站在手機(jī)、平板、PC、微信下都能呈現(xiàn)。建站過程建立專項(xiàng)小組,與您實(shí)時(shí)在線互動(dòng),隨時(shí)提供解決方案,暢聊想法和感受。

1. SetCharacterEncodingFilter

    public void doFilter(ServletRequest request, ServletResponse response,

                         FilterChain chain) {

        // Conditionally select and set the character encoding to be used

        if (ignore|| (request.getCharacterEncoding()== null)) {

            String characterEncoding = selectEncoding(request);

            if (characterEncoding != null) {

                request.setCharacterEncoding(characterEncoding);

            }

        }

        chain.doFilter(request, response);

    }

Filter的doFilter方法如上所示,在這個(gè)類中,除了encoding這個(gè)參數(shù)外,還提供了一個(gè)ignore參數(shù)。該參數(shù)是一個(gè)開關(guān),主要用于決定是否要忽略客戶端請求中指定的encoding,如果為true,我們看到流程會(huì)直接進(jìn)行selectEncoding操作。在有特定的需要時(shí),可以繼承該Filter并重寫其selectEncoding方法實(shí)現(xiàn),例如根據(jù)請求頭中的Accept-Language項(xiàng)進(jìn)行對應(yīng)的encoding設(shè)置,或者根據(jù)session中特定的標(biāo)識進(jìn)行設(shè)置。

Tomcat中怎么設(shè)置編碼Filter

附加參數(shù)的處理

我們知道,對于Filter或Servlet等,我們都可以在web.xml中為其指定初始化參數(shù),我們稱之為initParameter。對于我們自己的應(yīng)用,可能已經(jīng)定義好了要傳入的參數(shù),直接在應(yīng)用內(nèi)解析傳入的值即可。

而Tomcat內(nèi)部為了在多個(gè)Filter中支持多種形式的自定義initParameter,特意定義了一個(gè)工具類用于解析傳入的參數(shù)。

我們上面提到的Filter,其繼承自FilterBase這樣一個(gè)基類,而基類中主要用于進(jìn)行初始化參數(shù)的設(shè)置

public void init(FilterConfig filterConfig) throws ServletException {

        Enumeration<String> paramNames = filterConfig.getInitParameterNames();

        while (paramNames.hasMoreElements()) {

            String paramName = paramNames.nextElement();

            if (!IntrospectionUtils.setProperty(this, paramName,

                    filterConfig.getInitParameter(paramName))) {

                String msg = sm.getString("filterbase.noSuchProperty",

                        paramName, this.getClass().getName());

                if (isConfigProblemFatal()) {

                    throw new ServletException(msg);

                } else {

                    getLogger().warn(msg); }} }

這個(gè)工具類即為上面標(biāo)紅的IntrospectionUtils。

Utils中主要使用反射進(jìn)行參數(shù)值的設(shè)置,即反射調(diào)用對應(yīng)參數(shù)的setter進(jìn)行賦值。我提到這個(gè)工具類,主要目的并不是想說反射,而是其實(shí)現(xiàn)的方式可以進(jìn)行參考,以及對于邊界條件的考慮很周全。

例如,拿到class對應(yīng)的Method之后,會(huì)判斷其參數(shù)的個(gè)數(shù),類型等。

       // First, the ideal case - a setFoo( String ) method

            for (int i = 0; i < methods.length; i++) {

                Class<?> paramT[] = methods[i].getParameterTypes();

                if (setter.equals(methods[i].getName()) && paramT.length == 1

                        && "java.lang.String".equals(paramT[0].getName())) {

                    methods[i].invoke(o, new Object[] { value });

                    return true;

                }

            }

在考慮其它類型時(shí),除基礎(chǔ)類型外,還考慮到了包裝類

if (setter.equals(methods[i].getName())

                        && methods[i].getParameterTypes().length == 1) {

                    // match - find the type and invoke it

                    Class<?> paramType = methods[i].getParameterTypes()[0];

                    Object params[] = new Object[1];

                    // Try a setFoo ( int )

                    if ("java.lang.Integer".equals(paramType.getName())

                            || "int".equals(paramType.getName())) {

                        try {

                            params[0] = new Integer(value);

                        } catch (NumberFormatException ex) {

                            ok = false;

                        }

                    // Try a setFoo ( long )

                    }else if ("java.lang.Long".equals(paramType.getName())

                                || "long".equals(paramType.getName())) {

                            try {

                                params[0] = new Long(value);

                            } catch (NumberFormatException ex) {

                                ok = false;

                            }

                        // Try a setFoo ( boolean )

                    } else if ("java.lang.Boolean".equals(paramType.getName())

                            || "boolean".equals(paramType.getName())) {

                        params[0] = Boolean.valueOf(value);

}

對于參數(shù)的getter,除了getXXX,還想到了isXXX。

public static Object getProperty(Object o, String name) {

        String getter = "get" + capitalize(name);

        String isGetter = "is" + capitalize(name);

以上就是Tomcat中怎么設(shè)置編碼Filter,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站標(biāo)題:Tomcat中怎么設(shè)置編碼Filter
瀏覽地址:http://muchs.cn/article24/pppoce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站營銷型網(wǎng)站建設(shè)、建站公司網(wǎng)站策劃、App開發(fā)品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站