java开发过程当中从前台传到后台中文乱码《filter》

在企业开发中,最多见的是javaweb项目,有web项目就免不了和后台打交道,好比我从jsp页面发送新增请求到后台,后台多是servlet、struts二、springmvc等,这时就存在一个问题,在发送的参数值中若是包含中文常常到了后台你发现会是乱码,固然你能够在后台拿到值后对值进行从新编码,可是若是每次都要进行从新编码,会很麻烦,这里介绍一中简单的方式,但愿能够对你有用。java

filterweb

filter叫作过滤器,是java servlet中的技术,经过filter咱们能够对要访问的web服务器的资源进行过滤,以下图,从网上找的spring

能够看到要加了filter以后,要访问web资源必须经过过滤器,若是没有过滤器那么咱们能够直接访问web资源,这就是过滤器的做用,便可以控制对资源的访问;例如能够监控用户访问的url,能够禁止未登陆的用户访问,固然还有一个重点,那就是能够过滤字符集。好了进入正题数据库

Filter开发服务器

要开发filter有两个步骤mvc

一、编写java类实现javax.servlet.Filter接口app

二、注册filterjsp

编写filter实现类ide

1、filter接口有三个方法:init、destory、doFilterthis

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方法。

2、注册filter

所谓注册filter就是让web服务器知道filter,让filter起做用,须要再web.xml中进行注册,具体的注册的方式能够参考下边的例子。

字符过滤器

filter代码以下:

 1 package com.cn.imooc.filter;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.Filter;
 6 import javax.servlet.FilterChain;
 7 import javax.servlet.FilterConfig;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13 
14 public class SetCharacterEncodingFilter implements Filter {
15 
16      //存储编码格式信息
17       private String encode = null;
18     @Override
19     public void destroy() {
20         // TODO Auto-generated method stub
21 
22     }
23 
24     @Override
25     public void doFilter(ServletRequest req, ServletResponse resp,
26             FilterChain chain) throws IOException, ServletException {
27         // TODO Auto-generated method stub
28         
29          //转换
30            HttpServletRequest request = (HttpServletRequest)req;
31            HttpServletResponse response = (HttpServletResponse)resp;
32            
33            /*
34             * 判断在web.xml文件中是否配置了编码格式的信息
35             * 若是为空,则设置编码格式为配置文件中的编码格式
36             * 不然编码格式设置为utf-8
37 */ 38 if(this.encode != null && !this.encode.equals("")){ 39 request.setCharacterEncoding(this.encode); 40 response.setCharacterEncoding(this.encode); 41 }else{ 42 request.setCharacterEncoding("utf-8"); 43 response.setCharacterEncoding("utf-8"); 44 } 45 46 /* 47 * 使用doFilter方法调用链中的下一个过滤器或目标资源(servlet或JSP页面)。 48 * chain.doFilter处理过滤器的其他部分(若是有的话),最终处理请求的servlet或JSP页面。 49 */ 50 chain.doFilter(request, response); 51 52 } 53 54 @Override 55 public void init(FilterConfig arg0) throws ServletException { 56 // TODO Auto-generated method stub 57 58 this.encode=arg0.getInitParameter("encode"); 59 System.out.println("this.encode:"+encode); 60 } 61 62 }

在init方法中得到配置的初始化参数“encode”,把请求强转为httpSerevletRequest和HttpServletResponse,而后设置编码,最后调用chain.doFilter(request,response)方法,这样便实现了对编码的过滤。


注册filter以下,在web.xml中:

 1 <!-- 过滤器配置信息 -->
 2     <filter>
 3         <filter-name>SetCharacterEncodingFilter</filter-name>
 4         <!-- 过滤器设置编码文件 -->
 5         <filter-class>com.cn.imooc.filter.SetCharacterEncodingFilter</filter-class>
 6         <init-param>
 7             <!-- init-param元素定义了过滤器的初始化参数-->
 8             <description>给参数和值设置名称和编码类型</description>
 9             <param-name>encode</param-name>
10             <param-value>utf-8</param-value>
11         </init-param>
12     </filter>
13     <filter-mapping>
14         <!--  filter-mapping告诉容器全部与模式向匹配的请求都应该容许经过访问控制过滤器。
15                 全部以.action结尾的访问都先经过过滤器文件过滤 -->
16         <filter-name>SetCharacterEncodingFilter</filter-name>
17         <url-pattern>*.action</url-pattern>
18     </filter-mapping>

在注册filter的时候咱们配置了初始化参数,设为了utf-8,在拦截的url中设置了,拦截全部的以action为结尾的url请求。

经过以上的代码即可以统一设置请求的编码

有不对之处欢迎之处,谢谢!

相关文章
相关标签/搜索