`
Before_Morning
  • 浏览: 38187 次
文章分类
社区版块
存档分类
最新评论

过滤器的应用之全站乱码解决--Filter(二)

 
阅读更多

统一全站字符编码的过滤器

原理:通过配置参数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全局编码过滤器

    总的来说,JavaEE Filter全局编码过滤器是解决Web应用中字符编码问题的有效手段,它可以确保无论何时何地,数据的编码始终保持一致,避免因为编码不匹配引发的乱码问题。理解并熟练使用Filter对于开发健壮的JavaEE...

    javaweb全站请求编码过滤器

    在Java Web开发中,"全站请求编码过滤器"是一个至关重要的组件,它确保了所有来自客户端的请求数据(如表单提交、URL参数等)能够正确地被解码为服务器端可理解的格式,避免因为字符编码问题导致的数据乱码。...

    通过过滤器(Filter)解决JSP的Post和Request中文乱码问题

    在Web开发过程中,处理中文乱码问题是一道绕不过的坎。特别是使用Java作为后端开发语言...在开发中,我们只需要配置好相应的过滤器,就可以在全站范围内解决乱码问题,无需在每个Servlet或JSP页面中重复处理编码问题。

    javaweb中Filter(过滤器)的常见应用.docx

    * @Description: 此过滤器用来解决全站中文乱码问题 */ public class CharacterEncodingFilter implements Filter { private FilterConfig filterConfig = null; // 设置默认的字符编码 private String default...

    Filter过滤器的代码及其web.xml配置代码

    在Java Web开发中,Filter(过滤器)是一个非常重要的组件,它允许我们在数据处理之前或之后执行特定的任务,比如防止跨站脚本攻击(XSS)、处理字符编码问题、实现权限控制等。在这个主题中,我们将深入理解Filter的...

    JavaWeb中过滤器的三个小案例

    案例3:解决全站字符乱码问题 字符编码问题常常困扰着开发者,尤其是在处理POST和GET请求时。JavaWeb过滤器可以很好地解决这个问题。我们创建一个过滤器,重写doFilter方法,在请求进入Servlet之前设置合适的字符...

    Servlet-1-filter-3.rar

    为了解决这个问题,我们可以利用Filter(过滤器)机制。Filter是Java Servlet API的一部分,它允许我们在请求到达Servlet之前或者在响应离开Servlet之后对其进行拦截和处理。在本例中,我们可能有一个专门的Filter来...

    javaweb_高级_过滤器_监听器

    在`&lt;filter-mapping&gt;`标签内,我们可以配置多种过滤器拦截规则,如: 1. **URL模式匹配**:完全匹配(如`/hello`)、目录匹配(如`/admin/*`)和扩展名匹配(如`*.jsp`)。 2. **Servlet名称匹配**:当过滤的目标是...

    javaweb过滤器

    1. **全站中文乱码解决方案**:可以创建一个过滤器来统一设置所有请求和响应的字符编码。 2. **脏话过滤器**:用于过滤敏感词汇,可以在请求数据中查找并替换敏感词。 3. **HTML标记过滤器**:防止XSS攻击,可以...

    web项目乱码问题 jsp乱码问题解决

    这种方法可以避免在每个页面手动设置,实现全站统一处理。过滤器的配置和实现细节因具体框架和服务器环境而异,通常需要在web.xml中注册过滤器并指定编码。 对于GET提交的乱码,可以在URL重写时指定UTF-8编码,或者...

    Filter过滤器的概念和使用

    ### Filter过滤器的概念 在Java Web开发中,`Filter`是一种功能强大的机制,它能够拦截客户端请求,并在请求到达目标资源(如Servlet)之前或之后进行处理。这为开发者提供了极大的灵活性来添加诸如编码处理、登录...

    javaweb中Filter(过滤器)的常见应用

    本文将深入探讨javaweb中Filter的常见应用,以及如何解决全站字符编码问题。 首先,Filter是Java Servlet API的一部分,它遵循Servlet规范中的Filter接口。通过实现Filter接口并覆盖其`doFilter()`方法,开发者可以...

    详解Servlet之过滤器(Filter)

    Servlet 之过滤器(Filter)是一种非常重要的技术,它可以实现对资源的访问控制、请求和响应的拦截、处理中文乱码问题、实现自动登录、过滤敏感词汇、压缩网页、选择性让浏览器缓存等多种功能。下面我们将详细介绍...

Global site tag (gtag.js) - Google Analytics