国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

解決全站字符亂碼(POST和GET中文編碼問題)

2019-11-14 23:30:21
字體:
來源:轉載
供稿:網友
解決全站字符亂碼(POST和GET中文編碼問題)

其實全站亂碼問題的難點就是處理GET請求參數的問題。

如果只是處理POST請求的編碼問題,以及響應編碼問題,這個就很好解決了response.setContentType("text/html;charset=utf-8");和request.setCharacterEncoding("utf-8");就可以解決的

好了,這里主要的就是解決GET請求參數的問題,我使用的方式是用過濾器(攔截器)Filter來解決,

我的思路是:

首先定義一過濾器allDecodingFilter的過濾器,這個過濾器是過濾全站的所有文件(<url-pattern>/*</url-pattern>),

1.要解決GET請求參數的問題,我們首先定義一個裝飾類(這里涉及到了裝飾者模式),裝飾類通俗一點的說法就是把原有的類的方法或屬性進行再改造。我就定義一個名為DecodingRequest的裝飾類,這個類必須繼承HttpServletRequestWrapper類,因為這個類繼承了HttpServletRequest接口,并實現HttpServletRequest接口的所有方法,那么只要我繼承了HttpServletRequestWrapper類就可以對該類里面的方法再重寫了(有興趣的話可以去看看j2ee源碼)。這里主要就是重寫getParameter(String name)方法。

2.回到過濾器中,我就可以把我自己定義的DecodingRequest類傳遞給Servlet的doget()和dopost()方法,那么當需要獲取參數調用getParameter(String name)時,其實就是調用自己定義的getParameter(String name)方法,那么就不會出現亂碼了??谑龅目赡懿缓?我還是通過代碼來說話吧

過濾器allDecodingFilter:

public class allDecodingFilter implements Filter {    public void destroy() {    }    /**     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)     */    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        HttpServletRequest req = (HttpServletRequest) request;                //處理響應編碼        HttpServletResponse reps = (HttpServletResponse) response;        response.setContentType("text/html;charset=utf-8");                        // 處理post請求參數的亂碼        request.setCharacterEncoding("utf-8");        // 若是Get請求方式就使用裝飾類的獲取的參數的方法        if (req.getMethod().equals("GET")) {            HttpServletRequest newReq = new DecodingRequest(req);//這個類下一步會陳述            /*             * 調包request 1. 自己定義的request的裝飾類 2. 在攔截通過時,使用我們自己定義request 3.             * 在Servlet中             * ,只有你調用request.getParameter(name)方法本質就是執行自己定義的request.getParameter             * (name)方法             */            chain.doFilter(newReq, response);        } else {            // 若是post方式就不使用裝飾類            chain.doFilter(request, response);        }    }    public void init(FilterConfig fConfig) throws ServletException {    }}

裝飾類DecodingRequest

/** *裝飾類(這是裝飾者模式) *HttpServletRequestWrapper:這個類幫我們實現了HttpServletRequest接口所有的方法, *那么我們就可以根據自己的需求對其里面的方法再進行實現 */public class DecodingRequest extends HttpServletRequestWrapper {    PRivate HttpServletRequest req;    public DecodingRequest(HttpServletRequest request) {        super(request);        this.req=request;    }    /**     * 獲取到參數進而修改編碼方式,當用戶獲取參數的時候就是執行了這個方法了     */    @Override    public String getParameter(String name) {        try {            //修改字符編碼方式            name=new String(req.getParameter(name).getBytes("iso-8859-1"),"utf-8");        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }        return name;    }}

Servlet測試類

public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        //這里實質調用的是DecodingRequest類中的request.getParameter("uname");方法        String name = request.getParameter("uname");        System.out.println(name);        response.getWriter().print(name);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        String name = request.getParameter("uname");        System.out.println(name);        response.getWriter().print(name);    }


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 高雄县| 天等县| 邓州市| 屏东县| 泌阳县| 日照市| 禄丰县| 莎车县| 横山县| 桓仁| 当涂县| 甘泉县| 兰州市| 景谷| 罗城| 来凤县| 酒泉市| 岳阳县| 永宁县| 扶沟县| 商都县| 萨迦县| 台安县| 雅安市| 修水县| 云浮市| 牙克石市| 雷波县| 南宁市| 南靖县| 濉溪县| 中宁县| 东明县| 民乐县| 万源市| 葫芦岛市| 锦屏县| 天等县| 定边县| 嘉鱼县| 巴青县|