在企业开发中,最常见的是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》的更多相关文章

  1. 解决java web中safari浏览器下载后文件中文乱码问题

    解决java web中safari浏览器下载后文件中文乱码问题 String fileName = "测试文件.doc"; String userAgent = request.g ...

  2. [转]JSP或servlet中(以及上传下载文件)中文乱码或不显示的解决方案

    时间 2014-04-14 14:33:44  CSDN博客 原文  http://blog.csdn.net/xby1993/article/details/23677375 主题 ServletJ ...

  3. Java前台传值至后台中文乱码

    记一次常见问题 今天导入了一个网上下载的项目,运行后发现,前台传值 到Servlet,Servlet保存至数据库,数据库保存的中文数据出现乱码,检查了一下表中的编码是utf8没错. 输出测试了一下 原 ...

  4. android(java) 开发过程中经验及总结记录

    android(java) 开发过程中经验及总结记录

  5. 【Java基础】Java开发过程中的常用工具类库

    目录 Java开发过程中的常用工具类库 1. Apache Commons类库 2. Guava类库 3. Spring中的常用工具类 4. 其他工具 参考 Java开发过程中的常用工具类库 1. A ...

  6. quartusii开发过程中路径不能出现空格或中文

    quartusii开发过程中路径不能出现空格或中文,否则软件出现.stf文件错误提示,开发环境搭建的时候也不能出现空格和中文,否则也会报错.

  7. JSP中pageEncoding和charset区别,中文乱码解决方案(转载)

    转载自:JSP中pageEncoding和charset区别,中文乱码解决方案 JSP指令标签中<%@ page contentType="text/html;charset=GB23 ...

  8. PL/SQL客户端中执行insert语句,插入中文乱码

    问题描述:在PL/SQL客户端中执行insert语句,插入中文乱码 解决方案: 1.执行脚本 select userenv('language') from dual;    结果为AMERICAN_ ...

  9. Base64 JAVA后台编码与JS前台解码(解决中文乱码问题)

    中文通过Java后台进行Base64编码后传到前台,通过JS进行Base64解码时会出现中文乱码的问题,被这个问题也是困扰了几天,使用jquery.base64.js只能转码非中文字符,经过搜集各种方 ...

随机推荐

  1. mac添加环境变量

    两个问题: 1.nodejs的安装 使用Mac OS X Binaries (.tar.gz)(64位)来安装: http://www.nodejs.org/download/ 安装参照:http:/ ...

  2. 使用magick.net将pdf转换为图片

    现在手上有个需求是要将pdf转换为一页一页的image.最开始找到的是pdfbox来处理pdf的.在pdfbox.apache.org的官网首页写了一句'convert you pdfs to ima ...

  3. 从抽象谈起(三):AOP编程和ASP.NET MVC

    AOP(Aspect oriented programming)面向切面编程.说成切面不容易理解,代码哪里有切面?又不是三维物体.概念不管,我们从其思想来理解这个名词吧. AOP的主要思想是把相同.相 ...

  4. 使用过滤器解决SQL注入和跨站点脚本编制

    1 SQL注入.盲注 1.1 SQL注入.盲注概述 Web 应用程序通常在后端使用数据库,以与企业数据仓库交互.查询数据库事实上的标准语言是 SQL(各大数据库供应商都有自己的不同版本).Web 应用 ...

  5. ivqBlog 开源博客 (angularjs + express + mongodb)

    转向做全职前端差不多一年的时间了,其中学习了构建工具grunt,gulp,angularjs,coffeescript,less,sass,自己想要做全栈开发,所以自学了mongodb,nodejs, ...

  6. CSS基础(五):定位

    CSS定位机制 CSS 有三种基本的定位机制:相对定位.浮动和绝对定位. 相对定位 相对定位指的是设置为相对定位的元素框会偏移某个距离.元素仍然保持其未定位前的形状,它原本所占的空间仍保留. 如果将b ...

  7. 命令行 更新Android sdk

    使用如下代理服务器: 大连东软信息学院镜像服务器地址: http://mirrors.neusoft.edu.cn 端口:80 北京化工大学镜像服务器地址: IPv4: http://ubuntu.b ...

  8. 在内核中异步请求设备固件firmware的测试代码

    在内核中异步请求设备固件firmware的测试代码 static void ghost_load_firmware_callback(const struct firmware *fw, void * ...

  9. 译:用InnoSetup模块化安装依赖项

    译文出处:http://www.codeproject.com/Articles/20868/NET-Framework-Installer-for-InnoSetup 源文件下载:http://fi ...

  10. MVC5入门

    http://www.cnblogs.com/youring2/p/mvc-5-examining-the-edit-methods-and-edit-view.html