如何用过滤器过滤HTTP协议和非HTTP协议编码

在编写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 block
			return 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");

	}

}

解决成功!

如何用过滤器过滤HTTP协议和非HTTP协议编码,布布扣,bubuko.com

时间: 2024-10-13 15:19:22

如何用过滤器过滤HTTP协议和非HTTP协议编码的相关文章

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

Protocols 描述了如何异步处理网络事件.Twisted维护了许多协议的实现,如HTTP,Telent,DNS,IMAP.Portocols实现了IProtocol接口, IProtocol包含如下方法: makeConnection:在两个节点中间创建连接.节点通过transport连接. connectionMade:当连接建立时调用. dataReceived:当数据到达时调用. connectionLost:当连接关闭时调用. Protocol Factories Factory用

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

本文将使用一个gitHub开源的组件技术来读写西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 github地址:https://github.com/dathlin/HslCommunication 如果喜欢可以star或是fork,还可以打赏支持,打赏请认准源代码项目. nuget地址:https://www.nuget.org/packages/HslCommunication/      

(1)网络编程的常识 (2)基于tcp协议的编程模型 (3)tcp协议和udp协议的比较 (4)基于udp协议的编程模型

1.网络编程的常识 目前主流的网络通讯软件有:微信.QQ.YY.陌陌.探探.飞信.阿里旺旺.... 在吗? 1.1 七层网络模型(熟悉) 为了保证数据传递的可靠安全等等,ISO(国际标准委员会组织)将数据的传递从逻辑上划分为以下七层: 应用层.表示层.会话层.传输层.网络层.数据链路层.物理层. 在发送数据之前要按照上述七层协议从上到下一层一层进行加包处理,再发送出去; 在接收数据之后要按照上述七层协议从下到上一层一层进行拆包处理,再解析出来: 1.2 常用的协议(熟悉) http协议 - 超文

Android即时通讯开发之XMPP (一)初识XMPP协议和asmack

在讲XMPP和asmck之前 ,我还是先分享一些资源文档,如果你有耐心,可以直接忽略我下面所写的.下面有关XMPP的介绍大部分是摘抄网上的文档,后面我会写一些基于XMPP协议和asmck开源库的聊天室开发,功能包括,文本,语音,和当前地理位置地址. XMPP官网:http://xmpp.org Smack开发官方指导文档:http://www.igniterealtime.org/builds/smack/dailybuilds/documentation/extensions/index.ht

TCP协议和socket API 学习笔记

本文转载至 http://blog.chinaunix.net/uid-16979052-id-3350958.html 分类: 原文地址:TCP协议和socket API 学习笔记 作者:gilbertjuly  • TCP包头 ACK为1时,确认序号有效,表示期望收到的下一个序号,是上次成功收到的字节序加1. SYN, FIN都占用一个序号. • TCP连接的建立 client通过connect()来建立TCP连接,connect()会发送SYN报文: server通过bind().list

Http协议和IO模型

HTTP 协议和IO模型 一:HTTP协议 http协议:HyperText Transfer Procotol超文本传输协议,http协议是无状态的,监听在80端口,TCP协议上.HTTP协议的特点有以下几点: 1.支持客户/服务器模式.2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径.请求方法常用的有GET.HEAD.POST.每种方法规定了客户与服务器联系的类型不同.由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快.3.灵活:HTTP允许传输任意类型的数据

tcp协议和udp协议的差别

tcp协议和udp协议的差别 是否连接          面向连接                 面向非连接 传输可靠性       可靠                       不可靠 应用场合         传输少量数据         大量数据 速度                   慢                            快 TCP要求和服务器保持连接  UDP不需要   TCP数据是有序的(先写的数据对方一低昂先收到)UDP数据是无序的 AsyncSocke

比较下OceanBase的选举协议和Raft的选举协议的区别

阿里技术大讲堂OceanBase专场中曾有专门一场讲座介绍OB自己实现的分布式选举算法:<分布式选举-破解数据库高可用性难题> 这里简单列一下这个选举算法和raft论文中提到的选举算法的区别. 如下都是以OB的立场说的: 1)OB使用的选举算法,选举开始点靠timer对齐,保证网络中的参与者都是“同时”发起选举的:而Raft是一个非同步发起的选举,往往是先开始选举的candidate赢得选举: 2)OB选举算法有一个预投票阶段,可以保证根据特定业务逻辑选主:Raft无法实现特定选主: 3)OB

linux服务之http协议和httpd的配置(一)

http协议和httpd的配置 URL:Unifrom Resource Locator URL方案:scheme 服务器地址:ip:port 资源路径: http://www.magedu.com:80/bbs/index.php, https:// 基本语法: <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<fra