统一全站字符编码的过滤器
原理:通过配置参数encoding指明使用何种字符编码,以处理Html Form请求参数的中文问题
知识:
由于开发人员在filter中可以得到代表用户请求和响应的request、response对象,因此在编程中可以使用Decorator(装饰器)模式对request、response对象进行包装,再把
包装对象传给目标资源,从而实现一些特殊需求。
package com.jjyy.filter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
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;
public class EncodeFilter implements Filter {
private FilterConfig config = null;
private String encode = null;
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//响应的乱码处理
response.setContentType("text/html;charset=utf-8");
//装饰
chain.doFilter(new MyHttpServletRequest((HttpServletRequest)request), response);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.config = filterConfig;
this.encode = config.getInitParameter("encode")==null?"utf-8":config.getInitParameter("encode");
}
//请求乱码的处理
class MyHttpServletRequest extends HttpServletRequestWrapper{
private HttpServletRequest request = null;
boolean isNotEncode = true;
public MyHttpServletRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public Map getParameterMap() {
try {
if(request.getMethod().equalsIgnoreCase("POST")){
request.setCharacterEncoding(encode);
return request.getParameterMap();
}else if(request.getMethod().equalsIgnoreCase("GET")){
//request.getParameterMap()第一次会解决,然后缓存起来
//request.getParameterMap()第二次直接从缓存中的map
Map<String,String[]> map = request.getParameterMap();
if(isNotEncode){
for(Map.Entry<String, String[]> entry:map.entrySet()){
String [] vs = entry.getValue();
for(int i=0;i<vs.length;i++){
vs[i]= new String(vs[i].getBytes("iso8859-1"),encode);
}
}
isNotEncode = false;
}
return map;
}else{
return request.getParameterMap();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return super.getParameterMap();
}
@Override
public String getParameter(String name) {
return getParameterValues(name)==null?null:getParameterValues(name)[0];
}
@Override
public String[] getParameterValues(String name) {
return (String[])getParameterMap().get(name);
}
}
}
分享到:
相关推荐
总的来说,JavaEE Filter全局编码过滤器是解决Web应用中字符编码问题的有效手段,它可以确保无论何时何地,数据的编码始终保持一致,避免因为编码不匹配引发的乱码问题。理解并熟练使用Filter对于开发健壮的JavaEE...
在Java Web开发中,"全站请求编码过滤器"是一个至关重要的组件,它确保了所有来自客户端的请求数据(如表单提交、URL参数等)能够正确地被解码为服务器端可理解的格式,避免因为字符编码问题导致的数据乱码。...
在Web开发过程中,处理中文乱码问题是一道绕不过的坎。特别是使用Java作为后端开发语言...在开发中,我们只需要配置好相应的过滤器,就可以在全站范围内解决乱码问题,无需在每个Servlet或JSP页面中重复处理编码问题。
* @Description: 此过滤器用来解决全站中文乱码问题 */ public class CharacterEncodingFilter implements Filter { private FilterConfig filterConfig = null; // 设置默认的字符编码 private String default...
在Java Web开发中,Filter(过滤器)是一个非常重要的组件,它允许我们在数据处理之前或之后执行特定的任务,比如防止跨站脚本攻击(XSS)、处理字符编码问题、实现权限控制等。在这个主题中,我们将深入理解Filter的...
案例3:解决全站字符乱码问题 字符编码问题常常困扰着开发者,尤其是在处理POST和GET请求时。JavaWeb过滤器可以很好地解决这个问题。我们创建一个过滤器,重写doFilter方法,在请求进入Servlet之前设置合适的字符...
为了解决这个问题,我们可以利用Filter(过滤器)机制。Filter是Java Servlet API的一部分,它允许我们在请求到达Servlet之前或者在响应离开Servlet之后对其进行拦截和处理。在本例中,我们可能有一个专门的Filter来...
在`<filter-mapping>`标签内,我们可以配置多种过滤器拦截规则,如: 1. **URL模式匹配**:完全匹配(如`/hello`)、目录匹配(如`/admin/*`)和扩展名匹配(如`*.jsp`)。 2. **Servlet名称匹配**:当过滤的目标是...
1. **全站中文乱码解决方案**:可以创建一个过滤器来统一设置所有请求和响应的字符编码。 2. **脏话过滤器**:用于过滤敏感词汇,可以在请求数据中查找并替换敏感词。 3. **HTML标记过滤器**:防止XSS攻击,可以...
这种方法可以避免在每个页面手动设置,实现全站统一处理。过滤器的配置和实现细节因具体框架和服务器环境而异,通常需要在web.xml中注册过滤器并指定编码。 对于GET提交的乱码,可以在URL重写时指定UTF-8编码,或者...
### Filter过滤器的概念 在Java Web开发中,`Filter`是一种功能强大的机制,它能够拦截客户端请求,并在请求到达目标资源(如Servlet)之前或之后进行处理。这为开发者提供了极大的灵活性来添加诸如编码处理、登录...
本文将深入探讨javaweb中Filter的常见应用,以及如何解决全站字符编码问题。 首先,Filter是Java Servlet API的一部分,它遵循Servlet规范中的Filter接口。通过实现Filter接口并覆盖其`doFilter()`方法,开发者可以...
Servlet 之过滤器(Filter)是一种非常重要的技术,它可以实现对资源的访问控制、请求和响应的拦截、处理中文乱码问题、实现自动登录、过滤敏感词汇、压缩网页、选择性让浏览器缓存等多种功能。下面我们将详细介绍...