先引用下大佬的思路: 用过滤器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; } } }