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 ...
随机推荐
- Repaint轨迹保留?(待处理,待编辑)
import java.awt.Color; import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JPane ...
- java-常见异常
一.运行时异常 1.空指针(java.lang.NullPointerException) 2.类型转换() 3.数组下标越界(java.lang.ArrayIndexOutOfBoundsExcep ...
- thinkphp3.2设置session的过期时间
thinkPHP3.2中session的过期时间配置是不能使用的,我们需要修改一下它的配置文件thinkPHP>common>functions.php,找到这一行: if(isset($ ...
- SPFA导读及介绍(转载)
适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...
- JSP页面转向方式
1.RequestDispatcher.forward() 是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个S ...
- 【iCore3 双核心板_ uC/OS-III】例程三:任务的挂起与恢复
实验指导书及代码包下载: http://pan.baidu.com/s/1jIctRVo iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- Node.js学习记录
一.NPM 使用介绍 NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用 ...
- Java简单类——一对多映射(省、市)
class Province { private int pid ; private String name ; private City cities [] ; public Province (i ...
- 序列化(Serialization)据为JSONP远端请求
Insus.NET前些日子,有分享了一段代码,<使用JSONP跨域请求数据>http://www.cnblogs.com/insus/p/3512271.html 是使用jQuery的Da ...
- sublime 常用插件
1.ConvertToUTF8 支持 GBK, BIG5, EUC-KR, EUC-JP, Shift_JIS 等编码的插件 2.Bracket Highlighter 用于匹配括号,引号和html标 ...