javaWeb 使用 filter 处理全站乱码问题
1. web.xml文件中的配置
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>de.bvb.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>characterEncoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
2.CharacterEncodingFilter.java代码
package de.bvb.web.filter; import java.io.IOException;
import java.io.UnsupportedEncodingException; 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; /**
*
* <p><b>Function: 处理全站乱码问题
* </b></p>Class Name: CharacterEncodingFilter<br/>
* Date:2016-12-13下午3:31:40<br/>author:Administrator<br/>since: JDK 1.6<br/>
*/
public class CharacterEncodingFilter implements Filter {
private String charset = "UTF-8"; //默认编码设置为 UTF-8 @Override
public void init(FilterConfig filterConfig) throws ServletException {
String charset = filterConfig.getInitParameter("characterEncoding");
if (charset != null && !charset.equals("")) {
this.charset = charset;
}
} @Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp; request.setCharacterEncoding(charset); //只能处理post方式的请求乱码
response.setCharacterEncoding(charset);
response.setContentType("text/html;charset=" + charset); chain.doFilter(new CharacterEncodingHttpServletRequest(request), response);
} /**
*
* <p><b>Function: 使用包装设计模式处理get方式的请求乱码
* </b></p>Class Name: CharacterEncodingHttpServletRequest<br/>
* Date:2016-12-13下午3:45:29<br/>author:Administrator<br/>since: JDK 1.6<br/>
*/
class CharacterEncodingHttpServletRequest extends HttpServletRequestWrapper {
private HttpServletRequest request; public CharacterEncodingHttpServletRequest(HttpServletRequest request) {
super(request);
this.request = request;
} @Override
public String getParameter(String name) {
String value = request.getParameter(name);
if (!"get".equalsIgnoreCase(request.getMethod())) { //如果是非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);
}
} } @Override
public void destroy() {
} }
2.2 也可以通过动态代理技术处理 (-----------------------------有问题)
package de.bvb.web.filter; import java.io.IOException;
import java.io.UnsupportedEncodingException;
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;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse; /**
*
* <p><b>Function: 通过动态代理技术处理全站乱码问题
* </b></p>Class Name: CharacterEncodingFilter<br/>
* Date:2016-12-13下午3:31:40<br/>author:Administrator<br/>since: JDK 1.6<br/>
*/
public class CharacterEncodingFilter implements Filter {
private String charset = "UTF-8"; //默认编码设置为 UTF-8 @Override
public void init(FilterConfig filterConfig) throws ServletException {
String charset = filterConfig.getInitParameter("characterEncoding");
if (charset != null && !charset.equals("")) {
this.charset = charset;
}
} @Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
final HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
request.setCharacterEncoding(charset); //只能处理post方式的请求乱码
response.setCharacterEncoding(charset);
response.setContentType("text/html;charset=" + charset);
chain.doFilter((ServletRequest) Proxy.newProxyInstance(CharacterEncodingFilter.class.getClassLoader(), HttpServletRequest.class.getInterfaces(),
new InvocationHandler() { @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//改写 getParameter() 方法在get请求时候的功能
if ("get".equalsIgnoreCase(request.getMethod()) && "getParameter".equals(method.getName())) {
String value = (String) method.invoke(request, args);
if (value == null) {
return null;
}
return new String(value.getBytes("iso8859-1"), request.getCharacterEncoding());
}
return method.invoke(request, args);
}
}), response);
} @Override
public void destroy() {
} }
javaWeb 使用 filter 处理全站乱码问题的更多相关文章
- javaweb的Filter过滤器设置全站编码
FIlter配置全站编码有一种方法是重写getParameter方法,也就是继承HttpServletRequestWrapper在重写getParameter方法,还有一种就是如下: public ...
- JavaWeb使用Filter进行字符编码过滤 预防web服务中文乱码
JavaWeb使用Filter进行字符编码过滤 预防web服务中文乱码 准备条件:一个创建好的 JavaWeb 项目 步骤: 1.创建一个类并实现 Filter 接口 import javax.ser ...
- JavaWeb -- Servlet Filter 过滤器
1. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过Filter技术,开发人员可以实现用户在 ...
- selvert的过滤器filter处理中文乱码
注意问题:在学习用selvert的过滤器filter处理中文乱码时,在filter配置初始化时用了utf-8处理中文乱码,而在提交的jsp页面中却用了gbk.虽然两种都可以出来中文乱码,但是却造成了处 ...
- JavaWeb之Filter、Listener
昨天和大家介绍了一下JSON的用法,其实JSON中主要是用来和数据库交互数据的.今天给大家讲解的是Filter和Listener的用法. 一.Listenner监听器 1.1.定义 Javaweb中的 ...
- javaweb之Filter详解(转)
.概念: Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源: 例如Jsp, Servlet, 静态图片文件 ...
- JavaWeb之Filter过滤器
原本计划这一篇来总结JSP,由于JSP的内容比较多,又想着晚上跑跑步减减肥,所以今天先介绍Filter以及它的使用举例,这样的话还有些时间可以锻炼锻炼.言归正传,过滤器从字面理解她的话有拦网.过滤的功 ...
- javaweb之Filter过滤器详解
快速入门 1.新建一个类,实现Filter接口 2.实现doFilter()方法,打印一句话,来证明能够进行拦截 3.在web.xml中进行配置(参照Servlet配置) 4.访问一个页面,看看能不能 ...
- [JavaWeb] Servlet Filter
作用: Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息. 可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet.Servle ...
随机推荐
- WinForm 窗体属性
WinForm - C/S 客户端 B/S 网页端 客户端应用程序 - 是需要安装在用户电脑上才可以使用的程序特点:不需要联网也可以打开使用部分功能但是现在的情况是许多功能依然需要互联网的支持 ...
- java实现单链表反转
一.简介 经查阅,主要有两种方法实现链表反转,递归反转法和遍历反转法: 递归: 在反转当前结点之前先反转其后边的结点,即.从尾结点开始逆向反转各个节点的指针域指向: 遍历:从前往后反转各个结点的指针域 ...
- next()与nextLine的区别
next(): 1.一定要读取到有效字符后才可以结束输入. 2.对输入有效字符之前遇到的空白,next() 方法会自动将其去掉. 3.只有输入有效字符后才将其后面输入的空白作为分隔符 ...
- 如何给Sublime安装插件
第一步:点击链接http://sublime.wbond.net/Package%20Control.sublime-package下载Package Control. 第二步:点击打开Sublime ...
- Ansible (一)
epel rpm -ivh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm yum -y ins ...
- WooCommerce代码收集
修改首页和分类页面每页产品数量 每页显示多少产品默认跟随设置 » 阅读设置 » 博客页面至多显示的值,若要产品索引页和博文索引页使用不同的设置,可以使用下面的代码为产品索引页单独设置每页产品数. ad ...
- 织梦DEDECMS网站后台安全检测提示 加一个开关
1.进入后台后,点击 系统->系统基本参数->添加变量: 变量名称:cfg_safecheck_switch 变量值:N 变量类型:布尔(Y/N) 参数说明:启用安全监测系统: 2.找到系 ...
- JavaAnnotation和反射简化开发
Part I 我并不是在卖弄自己的英语有多少的了不起,只不过对Annotation这一次的解释真的很懊恼,“注解”和“注释”这两个对Annotation的翻译我听着不爽,所以全文都用Annotatio ...
- VirtualMachine所支持的操作
在JDK中com.sun.tools.attach.VirtualMachine提供了一些从外部进程attach到jvm上,并执行一些操作的功能.VirtualMachine的子类HotSpotVir ...
- FastDFS connect timed out
java.net.SocketTimeoutException: connect timed outUpload file "1003.png"fails:connect time ...