专栏首页Nicky's blogJSP页面跳转编码设置(Tomcat服务器)

JSP页面跳转编码设置(Tomcat服务器)

在做JSP系统时经常遇到的就是编码问题

而这个服务器可以是Tomcat、Weblogic,Tomcat服务器默认的编码为iso-8859-1,Weblogic默认的编码为UTF-8,所以程序运行时要注意编码设置

现在我们以一个jsp页面的代码,解释这些编码设置pageEncoding="UTF-8"说的是页面的编码,比如标题栏<title>还有其它内容等等

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">这代码说的是上下文编码,若我们设置charset="UTF-8",那我们在点击这个页面跳到的那个Servlet或者jsp页面就要用"request.setCharacterEncoding("UTF-8");"和"String newsbody = new String(request.getParameter("editorValue").getBytes("iso-8859-1"),"UTF-8");"意思是设置接收到的字符串编码为UTF-8,响应的编码设置,可以用response.setContentType("text/html;charset=UTF-8");

<%@page import="java.net.URLDecoder"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'test.jsp' starting page</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	<style type="text/css">  
		.news {  
		    width: 800px;  
		    margin: 0 auto;  
		}  
</style>  
	

  </head>
  
  <body>
     <%  
        request.setCharacterEncoding("UTF-8"); 
        response.setContentType("text/html;charset=GBK");
      	String newsbody = new String(request.getParameter("editorValue").getBytes("iso-8859-1"),"UTF-8");  
    %>  
  
    <div class="news">  
        <%=newsbody%>  
  
    </div>  

  </body>
</html>
String newsbody = new String(request.getParameter("editorValue").getBytes("iso-8859-1"),"UTF-8");  

给一个编码过滤器参考

import java.io.IOException;
import java.nio.charset.Charset;

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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @description: 编码过滤器, 解决get或post方式的乱码问题
 */
@WebFilter(filterName = "encodingFilter", urlPatterns = "/*")
public class EncodingFilter implements Filter {

	private static final Logger logger = LoggerFactory.getLogger(EncodingFilter.class);

	private String encode = "UTF-8";// 默认编码集
	
    private String containers_encode="ISO8859-1";//web容器编码
	
	@Override
	public void destroy() {
		logger.info("====过滤器正在销毁====");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest httpRequest = (HttpServletRequest) request;
		if (httpRequest.getMethod().equals("POST")) {
			logger.debug("post请求,直接设置编码");
			// 直接设置编码
			request.setCharacterEncoding(encode);
		} else {
			// 重写HttpServletRequestWrapper进行内部转码
			logger.debug("get请求,尝试转码");
			request = new Request(httpRequest);
		}
		// 设置返回客户端编码
		response.setCharacterEncoding(encode);
		chain.doFilter(request, response);// 交替权利给下一个过滤器或servlet服务
	}

	class Request extends HttpServletRequestWrapper {
		/* 构造函数 */
		public Request(HttpServletRequest request) {
			super(request);
		}

		private HttpServletRequest getHttpServletRequest() {
			return (HttpServletRequest) super.getRequest();
		}

		/**
		 * 转换由表单读取的数据的内码
		 * 
		 * @param str
		 * @return
		 */
		private String changeEncode(String str) {
			if (needEncoding(str)) {
				try {
					byte[] bytes = str.getBytes(containers_encode);
					logger.debug("数据:{} 转码结果:{}", str,
							new String(bytes, encode));
					return new String(bytes, encode);
				} catch (Exception e) {
					e.printStackTrace();
				}
				return null;
			}
			return str;
		}

		/* 判断字符串是否需要转码 */
		private boolean needEncoding(String str) {
			/* 如果为汉字,则不需要转码 */
			return Charset.forName(containers_encode).newEncoder().canEncode(str);
		}

		@Override
		/* 单个参数 */
		public String getParameter(String arg) {
			String value = getHttpServletRequest().getParameter(arg);
			if (value != null) {
				return changeEncode(getHttpServletRequest().getParameter(arg));
			}
			return getHttpServletRequest().getParameter(arg);
		}

		@Override
		/* 多个参数 */
		public String[] getParameterValues(String arg) {
			String values[] = getHttpServletRequest().getParameterValues(arg);
			if (values != null) {
				for (int i = 0; i < values.length; i++) {
					values[i] = changeEncode(values[i]);
				}
			}
			return values;
		}
	}

	@Override
	public void init(FilterConfig config) throws ServletException {
		logger.debug("====编码过滤器启动====");
		/* 读取配置参数的编码集 */
		String encoding = config.getInitParameter("encode");
		if (StringUtils.isNotBlank(encoding)) {
			this.encode = encoding;
		}
	}
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • WEB项目中使用UEditor(富文本编辑器)

    Ueditor富文本编辑器是在很多项目里经常用到的框架,是百度开发团队开发的一款很好用的富文本编辑器

    用户1208223
  • SpringMVC+ZTree实现树形菜单权限配置

    Team的Github开源项目链接:https://github.com/u014427391/jeeplatform 欢迎star(收藏)

    用户1208223
  • 基于Fusioncharts的报表统计

    本博客介绍fusioncharts插件的使用 先了解fusioncharts插件,fusioncharts是一款基于XML和flash的报表组件,支持Jav...

    用户1208223
  • 字符,字符集,字符编码

    现在Unicode已然一统天下,我想很多年轻的程序员可能都没遇到过编码问题,更不用说了解编码的发展了。前些日子在一个老网站上偶遇乱码,虽然入行时间不短,但对其究...

    大眼瞪小眼
  • 从"锟斤拷"到字符编码

    我们经常看一些谍战剧,谍战剧里敌特、地下党员以及八路军各部间发送情报的时候,一般都是通过电报发送的,电报在传递的过程中,需要发报员用电键发出长短不一的电码,收报...

    Java3y
  • openFileDialog的Filter属性设置

    OpenFileDialog对话框的Filter属性说明:          首先说明一个示例,分析一下Filter属性的构成:“ Excel文件|*.xls ...

    hbbliyong
  • Volley从源码梳理主要工作流程简记

    重点来了。 这里开启了一个缓存调度线程CacheDispatcher,一个网络请求调度线程NetworkDispatcher。

    coderZhen
  • 字符、字符集、编码,以及它们python中会遇到的一些问题(上)

    Echo_fy
  • PEG.js学习笔记

    PEG.js 是一个JavaScript的表达式语法解析器,它使您能够轻松地建立复杂的数据或计算机程序语言的快速分析器。

    IMWeb前端团队
  • PEG.js学习笔记

    本文作者:IMWeb 黄龙 原文出处:IMWeb社区 未经同意,禁止转载 PEG.js可以做什么? PEG.js 是一个JavaScript的表达式语...

    IMWeb前端团队

扫码关注云+社区

领取腾讯云代金券