【javaweb:Proxy&Filter】采用动态代理和过滤器解决request的全局乱码问题
2018-03-06 16:43
906 查看
package indi.proxy; import java.io.IOException; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; 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; /** * 目的:解决servlet和jsp中request的全局乱码问题,采用过滤器和动态代理实现,不过动态代理在实际开发中一般用于拦截,比如权限拦截, * 动态代理可以拦截到方法,比过滤器的拦截层次更深! * @author Administrator */ public class EncodingFilter implements Filter{ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //将ServletRequest对象进行转换,使它变成HttpServletRequest对象,这样它的方法更加的丰富,以便后面的调用 HttpServletRequest req=(HttpServletRequest) request; //接下来使用动态代理技术对request.getParameter()方法进行增强,使它实现无论什么提交方式都可以解决编码问题 HttpServletRequest enhanceRequest = (HttpServletRequest) Proxy.newProxyInstance( req.getClass().getClassLoader(), //采用反射机制获取req的字节码对象,再获得对应的类加载器 req.getClass().getInterfaces(), //采用反射机制,获取req的字节码对象,再获得它实现的接口的字节码数组 new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //获取方法的名称 String methodName = method.getName(); //如果方法名为getParameter,那么我们就对它进行增强 if("getParameter".equals(methodName)) { String invoke = (String) method.invoke(req, args); invoke=new String(invoke.getBytes("iso8859-1"),"UTF-8"); return invoke;//getParameter()方法的返回值我们对它进行了增强,使原参数为中文,则返回值也是中文 } return method.invoke(req, args);//其它的非getParameter()方法,采用默认返回值 } } ); //最后放行,注意:放行的request是我们增强后的enhanceRequest chain.doFilter(enhanceRequest, response); } @Override public void destroy() { } @Override public void init(FilterConfig arg0) throws ServletException { } }
相关文章推荐
- 【javaweb:Filter】通过过滤器和装饰设计模式解决request的全局乱码
- JavaWeb使用Filter、动态代理对客户端请求服务端参数中文乱码解决
- 通过过滤器(Filter)解决JSP的Post和Request中文乱码问题
- 通过过滤器(Filter)解决JSP的Post和Request中文乱码问题
- 动态代理解决全局乱码问题
- Java Web(二) Servlet中response、request乱码问题解决
- 利用filter和动态代理解决全站乱码问题
- 使用过滤器Filter解决Java系统中中文乱码的问题
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...
- 02-使用动态代理解决全局乱码问题
- 采用Filter的方法解决HttpServletRequest.getParameter乱码的问题
- javaWeb利用Filter解决中文乱码问题
- javaWeb自定义可排序过滤器注解,解决Servlet3.0下@WebFilter注解无法排序问题
- java web中配置Filter解决jsp中文乱码问题
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...
- JavaWeb中使用Filter以及装饰者设计模式解决全局编码格式问题
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...今天
- JAVA反射(四)之动态代理解决全局乱码问题
- javaweb_day10(servlet&request&response)之乱码解决遍
- 解决httpwebrequest无法通过使用代理的局域网获取response的问题