第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

Spring MVC 中文亂碼問題

1. 前言

本節(jié)課程將向大家講解 Spring MVC 項目中如何處理中文信息。通過本節(jié)課程你也將學習到如何使用 JAVA 方式動態(tài)配置過濾器。

中文亂碼的解決方式可以自定義過濾器,也可以使用 Spring MVC 自帶的過濾器。本章節(jié)的重點是掌握過濾器的使用。

2. 原生 API 解決方案

無論是基于原生 Servlet 、還是基于 Spring MVC 開發(fā),中文亂碼總是一件讓人頭痛的事情。

當用戶在網(wǎng)頁中輸入中文信息提交給服務器后,服務器端解析時得到可能是一個亂碼?;蛘弋敺掌靼l(fā)送中文數(shù)據(jù)給客戶端時,瀏覽器中顯示出來的也可能是亂碼。

為什么會產(chǎn)生中文亂碼?

服務器端在解析客戶端數(shù)據(jù)時,默認情況下使用的并不是中文編碼。同理,在服務器端把數(shù)據(jù)放入響應包中時,使用的也不是中文編碼。

知道事情原因后,就好辦了,只需要在服務器端解析數(shù)據(jù)或向數(shù)據(jù)包中寫入數(shù)據(jù)時選擇正確的中文編碼就可以了。

在登錄頁面輸入用戶名和密碼時,如下圖所示輸入中文:

圖片描述

在控制器中解析數(shù)據(jù)時,得到的是亂碼,既然是亂碼,后面的邏輯想都不用想,肯定是通不過的。

瀏覽器封裝數(shù)據(jù)到請求包時,使用的是支持中文的如 UTF-8 編碼。但是,在服務器解碼數(shù)據(jù)時,使用的并不是 UTF-8 編碼。編碼與解碼的前后不一致,導致中文亂碼的出現(xiàn)。

知道原因后,問題就不再是問題。

無論 Spring MVC 顯得多么高級,但解析數(shù)據(jù)還是由 HttpServletRequest 對象完成的,最直接的解決方案就是讓 Spring 注入原生的 HttpServletRequest 對象,再重設解析數(shù)據(jù)的編碼即可。

當然,為了保證中文數(shù)據(jù)能正確的寫入響應包,也需要注入 HttpServletResponse 。

@RequestMapping(value="/login")	
public String login01(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException {
	request.setCharacterEncoding("utf-8");
	response.setContentType("text/html;charset=utf-8");
	String userName=request.getParameter("userName");
	String userPassword=request.getParameter("userPassword");

	if("慕課".equals(userName) && "123".equals(userPassword)) {
		return "index";
	}
		return "fail";
	}
}

再次在瀏覽器中發(fā)起中文登錄請求,控制器能正確解析中文,驗證通過,跳轉(zhuǎn)到 “index” 視圖。

問題是得到了解決,但有種共產(chǎn)主義社會又回到原始社會的感覺,Spring MVC 的優(yōu)勢蕩然無存。

這種方案只能說是一種方案,而不能說是一種企業(yè)級的快速解決方案。

3. 自定義過濾器

使用過濾器,當然是絕佳的選擇方案,過濾器可以對來來往往的請求包、響應包做統(tǒng)一處理。過濾器以組件獨立的方式運行,不需要侵入目標響應控制器組件。完全符合 OOP 的高內(nèi)聚、低耦合要求。

自定義編寫一個簡單的解決中文亂碼過濾器:

public class EncodingFilter implements Filter {
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
	}
    @Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		req.setCharacterEncoding("utf-8");
		res.setContentType("text/html;charset=UTF-8");
		chain.doFilter(req, res);
	}
    @Override
	public void destroy() {
	}
}

編寫完過濾器后,需要讓 Tomcat 知道它的存在,可以在 web.xml 中進行配置。本章節(jié)使用純 JAVA 的配置方案。

打開 WebInitializer 類文件,重寫 onStartup()方法,使用 JAVA 方法注冊過濾器。

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
	super.onStartup(servletContext);
	EncodingFilter encodingFilter=new EncodingFilter();
	FilterRegistration.Dynamic register= servletContext.addFilter("encdoing", encodingFilter);
	register.addMappingForUrlPatterns(
			EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE), false, "/*");
}

Tips: 一定要加上 super.onStartup (servletContext); 語句,必須重用父類中的代碼。

在此方法中還可以動態(tài)配置 Servlet 、監(jiān)聽器 。

重構控制器代碼:

@RequestMapping(value="/login")	
public String login01(User user) throws UnsupportedEncodingException {	
	System.out.println(user.getUserName());
	if("慕課".equals(user.getUserName()) && "123".equals(user.getUserPassword())) {
		return "index";
	}
	return "fail";
}

發(fā)布項目、重啟 tomcat ,打開瀏覽器,進入登錄頁面。發(fā)送中文登錄信息,中文亂碼得到解決。

4. Spring MVC 字符編碼過濾器

Spring MVC 提供有一個名為 CharacterEncodingFilter 過濾器組件,可以直接配置使用。

WebInitializer 類的 onStartup() 方法中使用 CharacterEncodingFilter 替代自己的過濾器。

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
	super.onStartup(servletContext);
	CharacterEncodingFilter charEncodingFilter=new CharacterEncodingFilter();
	charEncodingFilter.setEncoding("utf-8");
	FilterRegistration.Dynamic register= servletContext.addFilter("encdoing", charEncodingFilter);
	register.addMappingForUrlPatterns(
			EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE), false, "/*");		
}

同樣的在瀏覽器中發(fā)送中文登錄請求,經(jīng)過過濾器的過濾后,中文亂碼問題得到了很好的解決。

CharacterEncodingFilter 很完美的解決了請求包的中文問題,也解決了響應瀏覽時的中文亂碼問題。

5. 小結(jié)

本節(jié)課程和大家探討了中文亂碼的問題,首先需要了解為什么會出現(xiàn)中文亂碼,知道原因后,解決的方案便會有很多。中文亂碼是一個共性問題,Spring MVC 框架提供了一個字符過濾器,很完美地解決了這個問題。

當然,通過本節(jié)課程,你也了解到了如何使用 JAVA 方式動態(tài)配置過濾器。