zoukankan      html  css  js  c++  java
  • 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代码如下:

     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请求。

    通过以上的代码便可以统一设置请求的编码

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

  • 相关阅读:
    面试-Hash是怎么实现的?
    教程-在Delphi中怎么查看是否有内存泄漏(Delphi2007)+WIN7
    面试-SizeOf一个对象会得到什么?
    Unity-Animator深入系列---录制与回放
    Animation.Sample用法介绍
    Unity-Animator深入系列---StateMachineBehaviour状态机脚本学习
    Unity-Animator深入系列---deltaPosition&deltaRotation
    Unity-Animato深入系列---FloatValue阻尼
    Animation在每一帧中的执行顺序测试
    Unity脚本在层级面板中的执行顺序测试2
  • 原文地址:https://www.cnblogs.com/teach/p/5676854.html
Copyright © 2011-2022 走看看