2019独角兽企业重金招聘Python工程师标准>>>

在编写web时,最苦恼的事情就是乱码了。

一直没怎么考虑过JSP第一句话中

<%@ page language="java" contentType="text/html; charset=GBK"  pageEncoding="GBK"%>

的ContentType和pageEncoding具体是用做什么的,害自己做了过滤器也老是出现问题。

Google下:

contentType ------------指定的是JSP页最终 Browser(客户端)所见到的网页内容的编码.pageEncoding ------------指定JSP编写时所用的编码

如果害怕忘了在每个jsp都加上这样的编码,或者由于不同环境所需的客户端所见编码的不同。加上过滤器来解决

1.HTTP协议下的过滤:

(1.login.jsp   )用来模拟输入数据登录

<%@ 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协议和URL编码</title>
</head>
<body>
<p>这里仅仅POST编码测试</p>
<form action="main.jsp" method="post">
<label>测试HTTP协议</label>
<input type="text" name="infoPost" />
<input type="submit" value="提交">
</form>
<hr>
<p>测试通过GET传送(url方式)</p>
<form action="main.jsp" method="get">
<label>测试URL</label>
<input type="text" name="infoGet" />
<input type="submit" value="提交">
</form>
</body>
</html>

(2.main.jsp  )用来模拟得到数据

<%@ 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>获取页面传过来的值</title>
</head>
<body>获取通过HTTP协议传送过来的值
<%=request.getParameter("infoPost") %>
<hr>
获取通过URL传送过来的值
<%=request.getParameter("infoGet") %>
</body>
</html>

(3.web.xml)配置

<!-- 编码过滤器 --><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)过滤器类

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 {/** 处理通过HTTP协议提交的数据*/HttpServletRequest hrequest = (HttpServletRequest) request;HttpServletResponse hresponse = (HttpServletResponse) response;// 这里省略前面两段,直接用request..setCharacterEncoding(encoding);效果是一样的,这里为了说明这个是通过HTTP// 协议提交System.out.println("编码格式" + encoding);hrequest.setCharacterEncoding(encoding);filterChain.doFilter(request, response);}/** 过滤器初始化*/public void init(FilterConfig filterConfig) throws ServletException {this.filterConfig = filterConfig;encoding = filterConfig.getInitParameter("encoding");}}

结果:

post方式参数存放在请求数据包的消息体中。get方式参数存放在请求数据包的请求行的URI字段中,以?开始以param=value&&parame2=value2的形式附加在URI字段之后。而request.setCharacterEncoding(charset); 只对消息体中的数据起作用,对于URI字段中的参数不起作用。

可以继承扩展HttpServletRequestWrapper 增加过滤功能

添加一个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;}//新增加一个转码方法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;}}//增强过滤的方法,就是将URI字段中的参数编码(重写)public String getParameter(String name) {//直接调用父类的getParameter方法获取参数的值String value=super.getParameter(name);//如果不为空就将其转码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 {/** 处理通过HTTP协议提交的数据*/HttpServletRequest hrequest = (HttpServletRequest) request;// 这里省略前面两段,直接用request..setCharacterEncoding(encoding);效果是一样的,这里为了说明这个是通过HTTP// 协议提交System.out.println("编码格式" + encoding);hrequest.setCharacterEncoding(encoding);//新增加方法<只要通过url来头中肯定有get>if(hrequest.getMethod().equalsIgnoreCase("get")){hrequest=new MyEncodeFilter(hrequest,encoding);}//filterChain.doFilter(hrequest, response);}/** 过滤器初始化*/public void init(FilterConfig filterConfig) throws ServletException {this.filterConfig = filterConfig;encoding = filterConfig.getInitParameter("encoding");}}

解决成功!

转载于:https://my.oschina.net/91jason/blog/295370

如何用过滤器过滤HTTP协议和非HTTP协议编码相关推荐

  1. 【计算机网络】分层、OSI七层协议和TCP四层协议

    文章目录 1. 计算机网络体系结构 2. OSI七层模型 2. TCP/IP四层模型 3. 五层协议 4. 数据传输 4.1 首部 1. 计算机网络体系结构 在计算机网络的基本概念中,分层次的体系结构 ...

  2. OSI协议和TCP/IP协议笔记

    1.OSI协议: 第7层应用层:OSI中的最高层.是用户与网络的接口.该层通过应用程序来完成网络用户的应用需求,如文件传输.收发电子邮件等.在此常见的协议有:HTTP,HTTPS,FTP,TELNET ...

  3. s7 200 java_java android 读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC...

    本文将使用一个gitHub开源的组件技术来读写西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 gi ...

  4. [Twisted] Protocols协议和Protocol Factories 协议工厂

    Protocols 描述了如何异步处理网络事件.Twisted维护了许多协议的实现,如HTTP,Telent,DNS,IMAP.Portocols实现了IProtocol接口, IProtocol包含 ...

  5. MACA协议和CSMA/CA协议的区别

    今天学计网802.11的时候想起了这个问题,很疑惑为什么基于MACA改进的CSMA/CA协议反而不能解决暴露站问题了.仔细翻了半小时课本,终于明白了.由于看到CSDN大部分博客讲的都是CSMA/CA和 ...

  6. 【csma/ca协议和csma/cd协议的matlab仿真详解】

    首先你的熟悉csma/ca协议,csma/cd协议: csma/ca协议: 点击打开链接 csma/cd协议: 点击打开链接 这个课题有几个难点部分: 1.就是需要考虑各种情况,并对每一种情况都必须做 ...

  7. CSMA/CD协议和CSMA/CA协议有什么具体的区别?

    csma/ca全称是带冲突避免的载波侦听多址接入协议,主要用于wlan无线局域网:csma/cd全称是带冲突检测的载波侦听多址接入协议,两者最重要的区别就在于csma/cd是发生冲突后及时检测,而cs ...

  8. CSMA/CD协议和CSMA/CA协议有什么具体的区别

    csma/ca全称是带冲突避免的载波侦听多址接入协议,主要用于wlan无线局域网:csma/cd全称是带冲突检测的载波侦听多址接入协议,两者最重要的区别就在于csma/cd是发生冲突后及时检测,而cs ...

  9. OPC协议和TCP/IP协议的区别和联系是什么

    OPC(OLE for Process Control)技术是指为了给工业控制系统应用程序之间的通信建立一个接口标准,在工业控制设备与控制软件之间建立统一的数据存取规范.它给工业控制领域提供了一种标准 ...

最新文章

  1. U3D的Collider
  2. 【基础复习】二:预处理、const与sizeof
  3. 【背景建模】基于时空特征(续2)
  4. 基于双向LSTM和迁移学习的seq2seq核心实体识别
  5. Vivado中IP核的xci, xcix, .dcp文件的区别
  6. 《Effective Java》第8章 通用程序设计
  7. python用表达式解密密文_基于Python解密仿射密码
  8. C语言 (条件编译#ifdef、#ifndef) (#if 常量,#if 1,#if 0)的用法
  9. 1._请写出5种以上的android中界面常用布局方式,跳槽季“充电宝”Android面试题(一)...
  10. 输出二叉树根节点到叶子结点所有路径
  11. c语言制作图片软件,大佬们,小菜鸟想问一问用vc编译器做简易画图软件
  12. discuz常用变量
  13. vue-video-player 一款vue的前端视频播放插件 支持m3u8
  14. 07_LTP语言技术平台
  15. 中文分句,处理双引号
  16. 俄亥俄大学计算机科学专业,美国计算机科学专业最新排名!
  17. C++、Qt 调用 lua 完成简单计算并得到结果( 出现中文 ‘?’问题)
  18. linux 16.04 密码,诡异的 登录 Linux / Ubuntu 16.04 系统 时, 系统提示 登录密码错误 之谜 !...
  19. Windows下搭建IOS开发环境
  20. CSS3 transform变形属性、2D变形、3D变形

热门文章

  1. ansible基础-playbooks
  2. C# LINQ(5)
  3. 量化策略研究员 - 工具篇
  4. jquery键盘事件
  5. 大家一起学面向对象设计模式系列Chapter 02 软件设计的基本原则
  6. Web开发学习点滴(持续更新)
  7. ActiveMQ传输文件的几种方式原理与优劣
  8. 高动态范围(HDR)
  9. caffe web demo 搭建
  10. Google谷歌首席科学家:神经网络的奇妙特性与应用