用过滤器filter设置post、get[重点]编码格式

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

猜你喜欢

转载自blog.csdn.net/qq_39203959/article/details/80081384