如何用过滤器过滤HTTP协议和非HTTP协议编码
生活随笔
收集整理的這篇文章主要介紹了
如何用过滤器过滤HTTP协议和非HTTP协议编码
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
在編寫web時(shí),最苦惱的事情就是亂碼了。
一直沒(méi)怎么考慮過(guò)JSP第一句話中
<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%>的ContentType和pageEncoding具體是用做什么的,害自己做了過(guò)濾器也老是出現(xiàn)問(wèn)題。Google下:
contentType ------------指定的是JSP頁(yè)最終 Browser(客戶端)所見(jiàn)到的網(wǎng)頁(yè)內(nèi)容的編碼.pageEncoding ------------指定JSP編寫時(shí)所用的編碼 如果害怕忘了在每個(gè)jsp都加上這樣的編碼,或者由于不同環(huán)境所需的客戶端所見(jiàn)編碼的不同。加上過(guò)濾器來(lái)解決1.HTTP協(xié)議下的過(guò)濾:
(1.login.jsp ? )用來(lái)模擬輸入數(shù)據(jù)登錄
<%@ page language="java" pageEncoding="GBK"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" > <title>HTTP協(xié)議和URL編碼</title> </head> <body> <p>這里僅僅POST編碼測(cè)試</p> <form action="main.jsp" method="post"> <label>測(cè)試HTTP協(xié)議</label> <input type="text" name="infoPost" /> <input type="submit" value="提交"> </form> <hr> <p>測(cè)試通過(guò)GET傳送(url方式)</p> <form action="main.jsp" method="get"> <label>測(cè)試URL</label> <input type="text" name="infoGet" /> <input type="submit" value="提交"> </form> </body> </html>(2.main.jsp ?)用來(lái)模擬得到數(shù)據(jù)
<%@ page language="java" pageEncoding="GBK"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" > <title>獲取頁(yè)面?zhèn)鬟^(guò)來(lái)的值</title> </head> <body>獲取通過(guò)HTTP協(xié)議傳送過(guò)來(lái)的值 <%=request.getParameter("infoPost") %> <hr> 獲取通過(guò)URL傳送過(guò)來(lái)的值 <%=request.getParameter("infoGet") %> </body> </html>(3.web.xml)配置 <!-- 編碼過(guò)濾器 --><filter><filter-name>EncodeFilter</filter-name><filter-class>demo.filter.EncodeFilter</filter-class><init-param><param-name>encoding</param-name><param-value>GBK</param-value></init-param></filter><filter-mapping><filter-name>EncodeFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>(4.EncodeFilter.java)過(guò)濾器類 package demo.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.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;/** 字符編碼 */ public class EncodeFilter implements Filter {protected String encoding;protected FilterConfig filterConfig;public EncodeFilter() {this.encoding = null;this.filterConfig = null;}public void destroy() {filterConfig = null;encoding = null;}public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) throws IOException, ServletException {/** 處理通過(guò)HTTP協(xié)議提交的數(shù)據(jù)*/HttpServletRequest hrequest = (HttpServletRequest) request;HttpServletResponse hresponse = (HttpServletResponse) response;// 這里省略前面兩段,直接用request..setCharacterEncoding(encoding);效果是一樣的,這里為了說(shuō)明這個(gè)是通過(guò)HTTP// 協(xié)議提交System.out.println("編碼格式" + encoding);hrequest.setCharacterEncoding(encoding);filterChain.doFilter(request, response);}/** 過(guò)濾器初始化*/public void init(FilterConfig filterConfig) throws ServletException {this.filterConfig = filterConfig;encoding = filterConfig.getInitParameter("encoding");}}
結(jié)果:
??
post方式參數(shù)存放在請(qǐng)求數(shù)據(jù)包的消息體中。get方式參數(shù)存放在請(qǐng)求數(shù)據(jù)包的請(qǐng)求行的URI字段中,以?開(kāi)始以param=value&¶me2=value2的形式附加在URI字段之后。而request.setCharacterEncoding(charset); 只對(duì)消息體中的數(shù)據(jù)起作用,對(duì)于URI字段中的參數(shù)不起作用。
可以繼承擴(kuò)展HttpServletRequestWrapper 增加過(guò)濾功能
添加一個(gè)MyEncodeFilter類
package demo.filter;import java.io.UnsupportedEncodingException;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper;public class MyEncodeFilter extends HttpServletRequestWrapper{private String encoding="GBK";public MyEncodeFilter(HttpServletRequest request) {super(request);}public MyEncodeFilter(HttpServletRequest request,String encoding) {super(request);this.encoding=encoding;}//新增加一個(gè)轉(zhuǎn)碼方法public String encodeName(String en){try {return new String(en.trim().getBytes("ISO-8859-1"),encoding);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blockreturn en;}}//增強(qiáng)過(guò)濾的方法,就是將URI字段中的參數(shù)編碼(重寫)public String getParameter(String name) {//直接調(diào)用父類的getParameter方法獲取參數(shù)的值String value=super.getParameter(name);//如果不為空就將其轉(zhuǎn)碼value=value==null?null:encodeName(value);return value;}}
改變后的Filter:
package demo.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.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;/** 字符編碼 */ public class EncodeFilter implements Filter {protected String encoding;protected FilterConfig filterConfig;public EncodeFilter() {this.encoding = null;this.filterConfig = null;}public void destroy() {filterConfig = null;encoding = null;}public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) throws IOException, ServletException {/** 處理通過(guò)HTTP協(xié)議提交的數(shù)據(jù)*/HttpServletRequest hrequest = (HttpServletRequest) request;// 這里省略前面兩段,直接用request..setCharacterEncoding(encoding);效果是一樣的,這里為了說(shuō)明這個(gè)是通過(guò)HTTP// 協(xié)議提交System.out.println("編碼格式" + encoding);hrequest.setCharacterEncoding(encoding);//新增加方法<只要通過(guò)url來(lái)頭中肯定有g(shù)et>if(hrequest.getMethod().equalsIgnoreCase("get")){hrequest=new MyEncodeFilter(hrequest,encoding);}//filterChain.doFilter(hrequest, response);}/** 過(guò)濾器初始化*/public void init(FilterConfig filterConfig) throws ServletException {this.filterConfig = filterConfig;encoding = filterConfig.getInitParameter("encoding");}}
解決成功!
轉(zhuǎn)載于:https://my.oschina.net/91jason/blog/295370
總結(jié)
以上是生活随笔為你收集整理的如何用过滤器过滤HTTP协议和非HTTP协议编码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: RandomForest随机森林总结
- 下一篇: 汇编指令速查表