溫馨提示×

溫馨提示×

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

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

Javaweb之Filter案例練習-項目全局編碼過濾器

發布時間:2020-05-20 08:37:35 來源:網絡 閱讀:484 作者:凱哥Java 欄目:編程語言

Filter全局編碼過濾器

這篇來做一個Filter在全局編碼過濾器練習,這篇新建一個web項目來做練習。

web項目創建

先創建一個叫GlobalFilter的web動態項目,把前面文章出現過的login.jsp復制過來,改成如下代碼。

<%@?page?language="java"?contentType="text/html; charset=UTF-8"

? ?pageEncoding="UTF-8"%>

<!DOCTYPE?html?PUBLIC?"-//W3C//DTD HTML 4.01 Transitional//EN"?"https://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta?http-equiv="Content-Type"?content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

????<form?action="${pageContext.request.contextPath}/web/loginServlet"?method="post">

????????用戶名:<input?type="text"?name="username"?/><br/>

????????<input?type="submit"?value="登錄"?/><br/>

????</form>

</body>

</html>

因為我們這里做全局編碼的練習,到時候登錄頁面輸入用戶名,我們會采用中文字符輸入。

Servlet創建

因為這里我們是模擬全局,實際中應該有許多servlet和許多前端頁面,例如注冊,登錄,首頁搜索等。我們就來創建一個servlet來模擬下就好。創建一個LoginServlet.java。?url-pattern是/web/loginServlet。

package?com.kaigejava.web.servlet;

import?java.io.IOException;

import?javax.servlet.ServletException;

import?javax.servlet.annotation.WebServlet;

import?javax.servlet.http.HttpServlet;

import?javax.servlet.http.HttpServletRequest;

import?javax.servlet.http.HttpServletResponse;

@WebServlet("/loginServlet")

public class?LoginServlet?extends?HttpServlet?{? ??

????public void?doGet(HttpServletRequest?request,?HttpServletResponse?response) throws?ServletException,?IOException?{

????????//request.setCharacterEncoding("UTF-8");

????????String name =?request.getParameter("username");

????????System.out.println(name);

????}? ??

????public void?doPost(HttpServletRequest?request,?HttpServletResponse?response) throws?ServletException,?IOException?{

????????doGet(request, response);

????}


}

以前,我們是通過這個紅圈代碼來設置編碼,這樣拿到中文的username就不會是亂碼。

Javaweb之Filter案例練習-項目全局編碼過濾器


現實開發中有很多個servlet,如果都這樣寫這行代碼來設置編碼,這行代碼就冗余,我們可以把這行代碼放到Filter過濾器中去。

Filter類創建

創建一個MyFilter.java?實現Filter接口,代碼如下。

package?com.kaigejava.web.filter;

import?java.io.IOException;

import?javax.servlet.Filter;

import?javax.servlet.FilterChain;

import?javax.servlet.FilterConfig;

import?javax.servlet.ServletException;

import?javax.servlet.ServletRequest;

import?javax.servlet.ServletResponse;

import?javax.servlet.annotation.WebFilter;

import?javax.servlet.http.HttpServletRequest;

public class?MyFilter?implements Filter {

????public void?destroy() {

????????// TODO Auto-generated method stub

????}? ??

????public void?doFilter(ServletRequest?request,?ServletResponse?response,?FilterChain?chain) throws?IOException,?ServletException?{

????????// 轉換對象

????????HttpServletRequest?req = (HttpServletRequest) request;

????????// 設置編碼

????????req.setCharacterEncoding("UTF-8");

????????// 放行

????????chain.doFilter(request, response);

????}


????public void?init(FilterConfig?fConfig) throws?ServletException?{

????????// TODO Auto-generated method stub

????}

}


web.xml內容如下

<?xml?version="1.0"?encoding="UTF-8"?>

<web-app?xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"?xmlns="https://java.sun.com/xml/ns/javaee"?xsi:schemaLocation="https://java.sun.com/xml/ns/javaee?https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"?id="WebApp_ID"?version="3.0">

?<display-name>GlobalFilter</display-name>

?<welcome-file-list>

? ?<welcome-file>index.html</welcome-file>

? ?<welcome-file>index.htm</welcome-file>

? ?<welcome-file>index.jsp</welcome-file>

? ?<welcome-file>default.html</welcome-file>

? ?<welcome-file>default.htm</welcome-file>

? ?<welcome-file>default.jsp</welcome-file>

?</welcome-file-list>

?

?<filter>

?????<filter-name>MyFilter</filter-name>

?????<filter-class>com.kaigejava.web.filter.MyFilter</filter-class>

?</filter>

?

?<filter-mapping>

?????<filter-name>MyFilter</filter-name>

?????<url-pattern>/*</url-pattern>

?</filter-mapping>

?

?<servlet>

? ?<servlet-name>LoginServlet</servlet-name>

? ?<servlet-class>com.anthony.web.servlet.LoginServlet</servlet-class>

?</servlet>

?<servlet-mapping>

? ?<servlet-name>LoginServlet</servlet-name>

? ?<url-pattern>/web/loginServlet</url-pattern>

?</servlet-mapping>

?

</web-app>


部署測試

現在部署到tomcat然后測試以下,前臺頁面用戶名輸入框輸入“張三”看看。

Javaweb之Filter案例練習-項目全局編碼過濾器

在Eclipse控制臺可以看到“張三”打印出來不亂碼,說明我們Filter中編碼設置起效果了。

Javaweb之Filter案例練習-項目全局編碼過濾器


Get方式提交表單問題

login.jsp中我們表單提交是post方法,如果改成get呢,會出問題。

Javaweb之Filter案例練習-項目全局編碼過濾器

重新部署,再來測試下

Javaweb之Filter案例練習-項目全局編碼過濾器

Javaweb之Filter案例練習-項目全局編碼過濾器

如果是get方式傳過來,中文就很有可能顯示亂碼。這個問題怎么解決了,有兩種方式解決,第一種不要寫get,就是post表單提交?,F在我們來看看第二種方式如何解決。在MyFilter類中寫一個通用的方法,既能解決get也能解決post的編碼問題。


裝飾模式解決get和post編碼問題

我們在MyFilter.java代碼中添加一個MyRequest?class,里面寫我們的裝飾器代碼,只重寫了getParameter(String text)方法。

package?com.kaigejava.web.filter;

import?java.io.IOException;

import?java.io.UnsupportedEncodingException;

import?javax.servlet.Filter;

import?javax.servlet.FilterChain;

import?javax.servlet.FilterConfig;

import?javax.servlet.ServletException;

import?javax.servlet.ServletRequest;

import?javax.servlet.ServletResponse;

import?javax.servlet.http.HttpServletRequest;

import?javax.servlet.http.HttpServletRequestWrapper;

public?class?MyFilter?implements?Filter {

????public?void?destroy() {

????????//?TODO?Auto-generated method stub

????}? ??

????public?void?doFilter(ServletRequest?request,?ServletResponse?response,?FilterChain?chain)?throws?IOException,?ServletException?{

????????//?轉換對象

????????HttpServletRequest?req?= (HttpServletRequest)?request;

????????//?設置編碼

????????//req.setCharacterEncoding("UTF-8");

????????//?放行

????????req?=?new?MyRequest(req);

????????//?req這個對象是包裝之后的對象,把這個傳到servlet中的request

????????chain.doFilter(req,?response);

????}


????public?void?init(FilterConfig?fConfig)?throws?ServletException?{

????????//?TODO?Auto-generated method stub

????}

}


/**

* ?繼承HttpServlet的包裝類,實現裝飾模式,解決getpost亂碼問題

*

*/

class?MyRequest?extends?HttpServletRequestWrapper{? ??

????HttpServletRequest?request;? ??

????public?MyRequest(HttpServletRequest?request) {

????????super(request);

????????this.request?=?request;

????}? ??

????public?String?getParameter(String?name) {

????????name?=?request.getParameter(name);?//亂碼

????????try?{

????????????return?new?String(name.getBytes("iso-8859-1"),?"UTF-8");

????????}?catch?(UnsupportedEncodingException?e) {

????????????e.printStackTrace();

????????}

????????return?null;

????}

? ??}



部署到tomcat,login.jsp表單還是get提交,測試可以解決get和post亂碼。

重寫其他方法

在request對象中,還有其他方法,例如getParameters()?getParameterMap(),這里我們把這兩個方法都重寫一下。

package?com.kaigejava.web.filter;

import?java.io.IOException;

import?java.io.UnsupportedEncodingException;

import?java.util.Map;

import?javax.servlet.Filter;

import?javax.servlet.FilterChain;

import?javax.servlet.FilterConfig;

import?javax.servlet.ServletException;

import?javax.servlet.ServletRequest;

import?javax.servlet.ServletResponse;

import?javax.servlet.http.HttpServletRequest;

import?javax.servlet.http.HttpServletRequestWrapper;

public?class?MyFilter?implements?Filter {

? ??public?void?destroy() {

????}

? ??public?void?doFilter(ServletRequest?request,?ServletResponse?response,?FilterChain?chain)?throws?IOException,?ServletException?{

????????//?轉換對象

????????HttpServletRequest?req?= (HttpServletRequest)?request;

????????//?放行

????????req?=?new?MyRequest(req);

????????//?req變成自己包裝的對象,然后傳遞給servlet中,servlet中的request就是調用包裝過的req

????????chain.doFilter(req,?response);

????}

? ??public?void?init(FilterConfig?fConfig)?throws?ServletException?{

????}

}


/**

*?繼承HttpServlet的包裝類,實現裝飾模式,解決getpost亂碼問題

*

*/

class?MyRequest?extends?HttpServletRequestWrapper?{

? ? ? ??HttpServletRequest?request;

? ? ? ??public?MyRequest(HttpServletRequest?request) {

????????super(request);

????????this.request?=?request;

????}

????

????/*@Override

????public String?getParameter(String name) {

????????name =?request.getParameter(name); //亂碼

????????try {

????????????return new String(name.getBytes("iso-8859-1"), "UTF-8");

????????} catch (UnsupportedEncodingException?e) {

????????????e.printStackTrace();

????????}

????????return null;

????}*/

????

????@Override

????public?String?getParameter(String?name) {

????????Map<String,?String[]>?map?=?getParameterMap();

????????return?map.get(name)[0];

????}

????

????@Override

????public?String[]?getParameterValues(String?name) {

????????Map<String,?String[]>?map?=?getParameterMap();

????????return?map.get(name);

????}

????

????public?boolean?flag?=?true;

????@Override

????public?Map<String,?String[]>?getParameterMap() {


????????Map<String,?String[]>?map?=?request.getParameterMap();?//?亂碼

????????if?(flag) {


????????????for?(Map.Entry<String,?String[]>?m?:?map.entrySet()) {

????????????????String[]?values?=?m.getValue();

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

????????????????????try?{

????????????????????????values[i] =?new?String(values[i].getBytes("iso-8859-1"),?"UTF-8");

????????????????????}?catch?(UnsupportedEncodingException?e) {

????????????????????????e.printStackTrace();

????????????????????}

????????????????}

????????????}

????????????flag?=?false;

????????}

????????return?map;

????}

}


由于最后三個方法,我們倒數第二個第三個都是調用倒數第一個,為了解決第一個調用亂碼好了,第二個再次調用又變成亂碼,所以這里在第三個方法添加了一個flag。



向AI問一下細節

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

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女