先引用下大佬的思路: 用过滤器filter设置编码格式
post编码是容易的:
1.在XML配置文件中
<filter>
<filter-name>Hello</filter-name>
<filter-class>com.jde.filter.HelloFilter</filter-class>
<init-param>
<param-name>encode</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
2.然后在过滤器方法init()中
可以通过filterConfig.getFilterName()获取到配置的编码UTF-8
//String name = filterConfig.getFilterName();
//获取配置在XML中的指定编码---->trim()是切割空白字符的。
String encode = filterConfig.getInitParameter("encode").trim();
//如果encode不为空,就让他赋值
if(encode != null && !"".equals(encode)){
this.encode = encode;
}
3.如果想要修改get请求方式的编码,需要创建一个类继承:HttpServletRequestWrapper
需要重写getParameter()这个方法!
同样,可以在创建一个多参数的构造器。
@Override
public String getParameter(String name) {
//调用的是父类getParameter获取传过来的参数
String value = super.getParameter(name);
/*
* 1.开始转码,
* 2.定义一个中间变量valueLast
*/
String valueLast = null;
//给valueLast赋值
try {
/*
* 判断value是否是null,
* 如果是会null,那么就给valueLast赋值null,
* 如果不是,就将value的内容用ISO-8859-1解码,然后用UTF-8在编码后返回一个字符串给valueLast
*/
valueLast = value==null?null:new String(value.getBytes("ISO-8859-1"),encode);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
4.然后就是要在doFilter()方法中配置了,如果是post方法直接
//设置post方式修改全站编码
request.setCharacterEncoding(this.encode);
如果是请求方式是:get
那么就需要:
if("get".equalsIgnoreCase(method)){
//创建request装饰实现类
req = new myW(req,this.encode);
}
System.out.println("chain同意向下执行!");
chain.doFilter(req, response);
....
OK---
贴下全部代码:
jsp代码:、
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1>使用post方式发送数据</h1>
<form action="/HelloFilter/servlet/HelloServlet" method="post">
姓名:<input name="username" type="text">
<input type="submit" value="提交">
</form>
<h1>使用get方式发送数据</h1>
<a href="/HelloFilter/servlet/HelloServlet?username=大家好">点击</a>
</body>
</html>
HttpServletRequestWrapper子类的代码:
package com.jde.filter;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class myW extends HttpServletRequestWrapper {
//设置request装饰器的默认编码属性
private String encode;
//无参构造器
public myW(HttpServletRequest request) {
super(request);
}
//定义有参构造器
public myW(HttpServletRequest request, String encode) {
super(request);
this.encode = encode;
}
/*
* 重写getparameter
*/
@Override
public String getParameter(String name) {
//调用的是父类getParameter获取传过来的参数
String value = super.getParameter(name);
/*
* 1.开始转码,
* 2.定义一个中间变量valueLast
*/
String valueLast = null;
//给valueLast赋值
try {
/*
* 判断value是否是null,
* 如果是会null,那么就给valueLast赋值null,
* 如果不是,就将value的内容用ISO-8859-1解码,然后用UTF-8在编码后返回一个字符串给valueLast
*/
valueLast = value==null?null:new String(value.getBytes("ISO-8859-1"),encode);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return valueLast;
}
}
过滤器代码:
package com.jde.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;
public class HelloFilter implements Filter {
private String encode;
//注销
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("start....");
//设置post方式修改全站编码
request.setCharacterEncoding(this.encode);
/*
* 现将请求方式强转
*/
HttpServletRequest req = (HttpServletRequest)request;
//获得请求方法,是get还是post
String method = req.getMethod();
System.out.println("打印请求方法:"+method);
/*
* 1.如果请求方式是get,就进入,开始设置get的编码方式
* 2.比较的时候不区分大小写
*/
if("get".equalsIgnoreCase(method)){
//创建request装饰实现类
req = new myW(req,this.encode);
}
System.out.println("chain同意向下执行!");
chain.doFilter(req, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器被创建...");
//String name = filterConfig.getFilterName();
//获取配置在XML中的指定编码---->trim()是切割空白字符的。
String encode = filterConfig.getInitParameter("encode").trim();
//如果encode不为空,就让他赋值
if(encode != null && !"".equals(encode)){
this.encode = encode;
}
}
}