private String encoding = null; 
改成:
private String encoding = "UTF-8"; 

解决方案 »

  1.   


    LZ已经设置了在web.xml里,我发现的确很难,我也弄了半天,可是没弄出来,Sorry
      

  2.   

    你这个过滤器倒是执行普通servlet的功能,没有发挥过滤器的作用
    另外<url-pattern>/filter </url-pattern> 你是想过滤/filter目录下的文件吗
    到filter中的值乱码表示你在传进来之前就是乱码
    在jsp页面没有使用编码所致
      

  3.   

    String name = new String(req.getParameter("username").getBytes("ISO-8859-1"), "utf-8");  
    不行再试下GBK 或者gb2312
      

  4.   

    这个要看你提交的那个页面了:
    可能有两种情况,首先你的提交页面设置的不是utf-8格式的,可能是GBK也可能是GB2312,这样就UTF-8就不能对上传参数解码。
    还有一个可能就是你的提交方式是get提交,而不是post提交,get提交和post提交的处理方式是不同的,post可以用request.setCharacterEncoding(encoding); 的方式进行字符解码,但是get提交不行,以为get提交是在链接后面直接挂上一个xxx=xxx的提交方式。所以要自己手动转码,对于这一点你可以自己手动实现转码(这是比较牛的一种做法),还有就是到网上下专门的转码包,这种包可以是java包,也可以是js控件。
      

  5.   

    过滤器本身写的有问题,根本没有将web.xml文件中的字符集读到
      

  6.   

    请问LS,哪有问题,,怎么没读到?我用了public void init(FilterConfig filterConfig) throws ServletException { 
    // TODO Auto-generated method stub 
    encoding = filterConfig.getInitParameter("encoding"); 

    这方法,那到不能读?里面是放字符串啊,而且名字也一样,怎么会没读到呢?请指明是哪错了,谢谢!!!
      

  7.   

    为了证明我是读到了字符集,再发几行代码,下面是我以前写的登陆页:
    <body>
         <form action="<%=request.getContextPath()%>/filter">
    请输入你的用户名:
    <input type="text" name="username">
    请输入你的密码:
    <input type="password" name="userpass">
    <input type="submit" value="过滤">
         </form>
    </body>怎么回说没读到呢?难道是我还不对?另外再回复5楼的大哥,我在JSP文件都设置了"UTF-8"编码的格式,下面给出代码看看:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%我是在MYECLIPSE系统设置了使用"UTF-8"编码格式的,应该不会有错!!还有,就你说的"另外 <url-pattern>/filter  </url-pattern> 你是想过滤/filter目录下的文件吗"这句话,请问是什么意思,我是初学者,不是很懂,这个"<url-pattern>"里面到底放的是一个随意写的URL地址(通过这个URL找到FILTER),还是需要过滤的目录啊?如果是后者,请仔细给我讲一下,具体是什么意思!!
      

  8.   

    过滤器是用来过滤请求的,也就是某个访问在请求某资源的情况下,先执行过滤器对请求进行处理。
    例如你设置了一个servlet
    <servlet>
    <servlet-name>Test</servlet-name>
    <servlet-class>org.spiniper.Test</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>Test</servlet-name>
    <url-pattern>/myproject/Test</url-pattern>
    </servlet-mapping>
    再设置一个过滤器
    <filter>
    <filter-name>FilterTest</filter-name>
    <filter-class>org.spiniper.FilterTest</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>FilterTest</filter-name>
    <url-pattern>/myproject/Test</url-pattern>
    </filter-mapping>
    那么当你通过/myproject/Test路径访问Test这个servlet资源的时候,就会先执行FilterTest来处理请求。
    这是一种单一的过滤模式,也就是说这个过滤器只有在用户访问/myproject/Test路径的时候,过滤器才会执行,如果访问的是/myproject/Test1或者/Test,那么过滤器就不会执行了。
    那么如何让过滤器截取所有请求呢,其实只要这样设置“<url-pattern>/*</url-pattern>”,那么所有请求都会被截取
    如果你只是想截取/myproject开头路径的所有请求你只要这样配置<url-pattern>/myproject/*</url-pattern>就可以截取/myproject路径下的所有请求了。还可以截取以某某后缀结尾的请求<url-pattern>*.html</url-pattern>。
    一般来说过滤器是用来进行安全验证和信息拦截的,当然也可以用来实现业务逻辑。过滤器是一个非常好用的东西,非常强大。
      

  9.   

    LS,谢谢你这么热心回复.但我还有几个问题没搞懂,首先,你说的"其实只要这样设置“ <url-pattern>/* </url-pattern>”,那么所有请求都会被截取 
    "这句话,如果这样设置,那过滤器就可以过滤全部的网页请求,包括什么.HTML .JSP什么的,反正全部都给过滤了,你是这意思吗?第二,你说的"如果你只是想截取/myproject开头路径的所有请求你只要这样配置 <url-pattern>/myproject/* </url-pattern>就可以截取/myproject路径下的所有请求了。"这句话,我还没怎么看懂,主要集中在"/myproject"和"myproject/*"这里我认为这两个URL是可以随便写的,什么叫截取/myproject路径下的所有请求啊?我的理解是在<url-pattern>里写的URL对应到上面的<filter-name>里的名字,在从这个名字找到<filter-class>里的类路径,那如果是这样的话,截取/myproject路径的所有请求是什么意思?
      

  10.   

    楼主,好了,我试过了,你的form里,要显试的写出 method="post"就ok了
      

  11.   

    好感谢LS,感谢大家,想问问,为什么改成method="post"就行了呢??能解释一下吗??
      

  12.   

    因为setRequestCharactor()只能保证post的http请求body中的字符集get是使用url传递,只要有中文放到url上,就会被搞死。因为url只能用iso-8859-1编码至于为什么url不支持中文,那是因为当初指定http协议规范的小组成员,都是欧美系国家的。
      

  13.   

    为啥post的时候就可以保证body中字符转换呢?因为post中使用的是二进制方式保存的,所以才能上传文件什么的。
    url因为确定是iso-8859-1字符,包含中文,还是按iso-8859-1把中文截断,最后就乱了。
      

  14.   

    <url-pattern>/*  </url-pattern>这种设置就是截取所有的访问,例如你的网址访问地址为http://xxx.xxx.xxx:8080/,那么别人访问这个网址下的任何资源都会执行过滤器,包括jsp,html。例如http://xxx.xxx.xxx:8080/test.html、http://xxx.xxx.xxx:8080/myproject/test.jsp。当然这跟上下文根有关系,如果你部署应用的上下文根是/test,那么过滤器会截取http://xxx.xxx.xxx:8080/test/下的所有请求。
     <url-pattern>/myproject/*  </url-pattern>这样设置的想过和上面差不多,只是它截取的是 <http://xxx.xxx.xxx:8080/myproject/下所有请求,如果上下文根是/test,那么就截取http://xxx.xxx.xxx:8080/test/myproject/下所有请求。