filter拦截(request增强解决全栈乱码)

1. 配置文件web.xml
<filter>
<filter-name>CharacterEncodingFilter2</filter-name>
<filter-class>cn.itcast.web.filter.CharacterEncodingFilter2</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

2. 定义类并实现Filter
public class CharacterEncodingFilter2 implements Filter {
private FilterConfig config;
private String defaultCharset="UTF-8";
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
this.config=filterConfig;
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
//获取要设置的字符集
String charset=this.config.getInitParameter("charset");
if(charset==null){
charset=defaultCharset;
}
//将ServletRequest/ServletResponse强转为HttpServletRequest/HttpServletResponse
HttpServletRequest request=(HttpServletRequest)req;
HttpServletResponse response=(HttpServletResponse)resp;
//按参数设置编码格式
request.setCharacterEncoding(charset);
response.setCharacterEncoding(charset);
response.setContentType("text/html;charset="+charset);
//放行
chain.doFilter( new Myrequest(request), response); //因为以上方法,只解决了post提交方式的乱码问题,没有解决get方式乱码问题,所以要对request方法进行增强。
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
3.定义包装类增强功能
/*增强包装类
 * 1.写一个类,实现与被增强对象相同的接口(通常继承sun公司已为用户写好的包装类,则可简化代码书写)
 * 2.定义一个变量,记住被增强对象
 * 3.定义一个构造方法,接收被增强对象
 * 4.覆盖想增强的方法
 * 5.对于不想增加的方法,直接调用被增强对象(目标对象)的方法
 * */
class Myrequest extends HttpServletRequestWrapper{ 通常继承sun公司已为用户写好的包装类,则可简化代码书写
private HttpServletRequest request;
public Myrequest(HttpServletRequest request) {
super(request);
this.request=request;
}
@Override
public String getParameter(String name) {
String value=this.request.getParameter(name);
if(!request.getMethod().equalsIgnoreCase("get")){
return value;
}
if(value==null){
return null;
}
try {
return value=new String(value.getBytes("iso8859-1"),request.getCharacterEncoding());
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值