java开发过程中从前台传到后台中文乱码《filter》
在企业开发中,最常见的是javaweb项目,有web项目就免不了和后台打交道,比如我从jsp页面发送新增请求到后台,后台可能是servlet、struts2、springmvc等,这时就存在一个问题,在发送的参数值中如果包含中文经常到了后台你发现会是乱码,当然你可以在后台拿到值后对值进行重新编码,但是如果每次都要进行重新编码,会很麻烦,这里介绍一中简单的方式,希望可以对你有用。
filter
filter叫做过滤器,是java servlet中的技术,通过filter我们可以对要访问的web服务器的资源进行过滤,如下图,从网上找的
可以看到要加了filter之后,要访问web资源必须通过过滤器,如果没有过滤器那么我们可以直接访问web资源,这就是过滤器的作用,即可以控制对资源的访问;例如可以监控用户访问的url,可以禁止未登录的用户访问,当然还有一个重点,那就是可以过滤字符集。好了进入正题
Filter开发
要开发filter有两个步骤
1、编写java类实现javax.servlet.Filter接口
2、注册filter
编写filter实现类
一、filter接口有三个方法:init、destory、doFilter
init
在filter创建时候执行,filter的创建有web服务器负责,在启动web服务器时会创建filter,这时便会执行filter的init方法,因为filter只会被创建一次,故init方法只会被调用一次,在此方法中可以获得通过FilterConfig获得注册时的初始化参数,提供了如下方法:
String getFilterName():得到filter的名称。
String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
public ServletContext getServletContext():返回Servlet上下文对象的引用。
destory
web服务器调用destory方法销毁filter,在filter的生命周期中此方法只执行一次,用户释放filter中使用的资源,如数据库连接等。
doFilter
此方法是整个filter的关键,我们要做的工作主要在此方法中完成,此方法提供三个参数:ServletRequest req, ServletResponse resp,
FilterChain chain ;chain参数是filter链,如果我们想让请求继续往下执行必须调用chain.doFilter方法,这样请求才会向下传递,我们可以根据自己的业务选择在何时调用chain.doFilter方法。
二、注册filter
所谓注册filter就是让web服务器知道filter,让filter起作用,需要再web.xml中进行注册,具体的注册的方式可以参考下边的例子。
字符过滤器
filter代码如下:
package com.cn.imooc.filter; import java.io.IOException; 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.HttpServletResponse; public class SetCharacterEncodingFilter implements Filter { //存储编码格式信息
private String encode = null;
@Override
public void destroy() {
// TODO Auto-generated method stub } @Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub //转换
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp; /*
* 判断在web.xml文件中是否配置了编码格式的信息
* 如果为空,则设置编码格式为配置文件中的编码格式
* 否则编码格式设置为utf-8
*/
if(this.encode != null && !this.encode.equals("")){
request.setCharacterEncoding(this.encode);
response.setCharacterEncoding(this.encode);
}else{
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
} /*
* 使用doFilter方法调用链中的下一个过滤器或目标资源(servlet或JSP页面)。
* chain.doFilter处理过滤器的其余部分(如果有的话),最终处理请求的servlet或JSP页面。
*/
chain.doFilter(request, response); } @Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub this.encode=arg0.getInitParameter("encode");
System.out.println("this.encode:"+encode);
} }
在init方法中获得配置的初始化参数“encode”,把请求强转为httpSerevletRequest和HttpServletResponse,然后设置编码,最后调用chain.doFilter(request,response)方法,这样便实现了对编码的过滤。
注册filter如下,在web.xml中:
<!-- 过滤器配置信息 -->
<filter>
<filter-name>SetCharacterEncodingFilter</filter-name>
<!-- 过滤器设置编码文件 -->
<filter-class>com.cn.imooc.filter.SetCharacterEncodingFilter</filter-class>
<init-param>
<!-- init-param元素定义了过滤器的初始化参数-->
<description>给参数和值设置名称和编码类型</description>
<param-name>encode</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<!-- filter-mapping告诉容器所有与模式向匹配的请求都应该允许通过访问控制过滤器。
所有以.action结尾的访问都先通过过滤器文件过滤 -->
<filter-name>SetCharacterEncodingFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
在注册filter的时候我们配置了初始化参数,设为了utf-8,在拦截的url中设置了,拦截所有的以action为结尾的url请求。
通过以上的代码便可以统一设置请求的编码
有不对之处欢迎之处,谢谢!
java开发过程中从前台传到后台中文乱码《filter》的更多相关文章
- 解决java web中safari浏览器下载后文件中文乱码问题
解决java web中safari浏览器下载后文件中文乱码问题 String fileName = "测试文件.doc"; String userAgent = request.g ...
- [转]JSP或servlet中(以及上传下载文件)中文乱码或不显示的解决方案
时间 2014-04-14 14:33:44 CSDN博客 原文 http://blog.csdn.net/xby1993/article/details/23677375 主题 ServletJ ...
- Java前台传值至后台中文乱码
记一次常见问题 今天导入了一个网上下载的项目,运行后发现,前台传值 到Servlet,Servlet保存至数据库,数据库保存的中文数据出现乱码,检查了一下表中的编码是utf8没错. 输出测试了一下 原 ...
- android(java) 开发过程中经验及总结记录
android(java) 开发过程中经验及总结记录
- 【Java基础】Java开发过程中的常用工具类库
目录 Java开发过程中的常用工具类库 1. Apache Commons类库 2. Guava类库 3. Spring中的常用工具类 4. 其他工具 参考 Java开发过程中的常用工具类库 1. A ...
- quartusii开发过程中路径不能出现空格或中文
quartusii开发过程中路径不能出现空格或中文,否则软件出现.stf文件错误提示,开发环境搭建的时候也不能出现空格和中文,否则也会报错.
- JSP中pageEncoding和charset区别,中文乱码解决方案(转载)
转载自:JSP中pageEncoding和charset区别,中文乱码解决方案 JSP指令标签中<%@ page contentType="text/html;charset=GB23 ...
- PL/SQL客户端中执行insert语句,插入中文乱码
问题描述:在PL/SQL客户端中执行insert语句,插入中文乱码 解决方案: 1.执行脚本 select userenv('language') from dual; 结果为AMERICAN_ ...
- Base64 JAVA后台编码与JS前台解码(解决中文乱码问题)
中文通过Java后台进行Base64编码后传到前台,通过JS进行Base64解码时会出现中文乱码的问题,被这个问题也是困扰了几天,使用jquery.base64.js只能转码非中文字符,经过搜集各种方 ...
随机推荐
- Microsoft.CSharp.CSharpCodeProvider
Microsoft.CSharp.CSharpCodeProvider MSDN 提供对 C# 代码生成器和代码编译器的实例的访问.类提供可用来检索 C# ICodeGenerator 和 ICode ...
- NPOIHelper.cs (NPOI 2.1.1)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- 使用DOSBox在Win7_x64下搭建汇编环境
1. 软件安装 1. debug.exe,masm.exe,link.exe,edit.com等汇编工具,一般32位的windows系统有自带,但64位系统下并没有,而且将32位系统下的工具拷贝到64 ...
- 精选19款华丽的HTML5动画和实用案例
下面是本人收集的19款超酷HTML5动画和实用案例,觉得不错,分享给大家. 1.HTML5 Canvas火焰喷射动画效果 还记得以前分享过的一款HTML5烟花动画HTML5 Canvas烟花特效,今天 ...
- Python--类-例子
class Base: def __init__(self): self.data = [] def add(self, x): self.data.append(x) def addtwice(se ...
- “远程调试监视器(MSVSMON.EXE)似乎没有在远程计算机上运行“的完美解决方案
今天调试程序时,Visual Studio突然报出了如下错误: Microsoft Visual Studio 远程调试监视器(MSVSMON.EXE)似乎没有在远程计算机上运行.这可能是因为防火墙阻 ...
- Unity3d游戏中自定义贝塞尔曲线编辑器[转]
关于贝塞尔曲线曲线我们再前面的文章提到过<Unity 教程之-在Unity3d中使用贝塞尔曲线>,那么本篇文章我们来深入学习下,并自定义实现贝塞尔曲线编辑器,贝塞尔曲线是最基本的曲线,一般 ...
- c与c++中的extern const的区别和联系
最近复习c++,发现了这个东西. c语言里面,我们在一个.c文件中用const定义了一个全局变量后,可以在另一个.c文件中用extern const来引用,但在c++中在链接的时候会报undefine ...
- SharePoint 2013中以其他用户身份登录的WebPart(免费下载)
在SharePoint 2013中微软并没有提供在SharePoint 2010中以其他用户身份登录的菜单,这对一般用户影响不大,但对于系统管理员或测试人员或特定人员(如在OA系统中的文员或秘书,常常 ...
- 读书笔记_Effective_C++_条款四十三:学习处理模板化基类的名称
背景是这样的,有两个不同的公司,然后想设计一个MessageSender,为这两个公司发送不同的消息,既支持明文发送SendClearText,也支持密文发送SendEncryptedText.一种思 ...