java对请求参数进行过滤_java web中使用过滤器对request及response中参数进行统一字符编码...

在java web中字符编码的处理是一件很繁琐的事情,如果不对编码进行处理,总会出现各种奇怪的字符,甚至如果代码写的不好,还可能引发莫名其妙的错误。所以,想偷懒的人们总会来研究一些能对字符编码进行统一处理的办法,此时,过滤器来担此大任!

由于目前国际通用编码为utf-8,因此本文默认使用该编码对字符进行处理。

下面开始进行讲解原理,已经理解原理的朋友可以直接跳到最下面,复制后可直接当工具类使用。

首先在servlet中,对于字符编码的处理,post和get方式传过来的数据的处理方式是不同的。

对于post方式传来的数据,处理方式很简单,只需要在最前面加上如下一句即可:

request.setCharacterEncoding("utf-8");

注意这一句必须放在获取参数之前,不然参数都获取完了你改request的编码也没用。

然后再get方法中,使用上述语句设置编码是不起作用的,这个时候你只能在获取完参数后,对参数值进行重新编码,才能正常显示。

//假设get方法中,有个参数叫name

String value = request.getParameter("name");

//之后对value进行重新编码

value = new String(value.getBytes("ISO8859-1"),"utf-8");

上面重新编码可能让人头疼了,不知哪里冒出来的ISO8859-1是什么鬼?

这是因为tomcat默认编码是ISO8859-1,这里这句话的意思就是说将原来获取到的乱码再用ISO8859-1进行解码,就得到了二进制字符串了,然后这个时候对字符串再使用utf-8进行编码,这样就能得到正常显示的字符串了。

那么搞清楚了以上,再看代码就很好理解了。在此提醒一句,已经在过滤器中设置过字符编码后,在servlet里就不要再设置了!如果把编码当成加密的话,加密两次,而只解密一次,那自然是得不到正确答案的。

首先是在web.xml里加上如下代码,init-param是在web.xml里就初始化要使用的编码,当然也可以在代码里直接硬编码咯:

CharacterFilter

filter.CharacterFilter

character

utf-8

CharacterFilter

/*

然后是过滤器CharacterFilter:

package 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.HttpServletRequestWrapper;

import javax.servlet.http.HttpServletResponse;

/*

* 过滤器,对所有servlet和jsp都生效,用于过滤字符编码

**/

public class CharacterFilter implements Filter{

//保存字符编码的类型,这个被设置在web.xml中

private String character;

@Override

public void destroy() {

}

@Override

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,

FilterChain filterChain) throws IOException, ServletException {

//强转

HttpServletRequest request = (HttpServletRequest) servletRequest;

HttpServletResponse response = (HttpServletResponse) servletResponse;

//对post编码进行设置

servletRequest.setCharacterEncoding(character);

//对响应编码(post和get方式的响应是相同的)

response.setContentType("text/html;charset="+ character);

response.setCharacterEncoding(character);

//对get编码进行设置

filterChain.doFilter(new CharacterEncodingForGet(request),response);

}

@Override

public void init(FilterConfig fc) throws ServletException {

character = fc.getInitParameter("character");

}

}

/*

* 对Get方式的请求参数进行编码

* */

class CharacterEncodingForGet extends HttpServletRequestWrapper{

private HttpServletRequest request = null;

public CharacterEncodingForGet(HttpServletRequest request) {

super(request);

this.request = request;

}

@Override

public String getParameter(String name) {

String value = super.getParameter(name);

if(value == null){

return null;

}

String method = request.getMethod();

if("get".equalsIgnoreCase(method)){

try{

value = new String(value.getBytes("ISO8859-1"),request.getCharacterEncoding());

}catch(Exception e){

e.printStackTrace();

}

}

return value;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值