java 过滤器(参数传递中文乱码)

(一)过滤器类编写。 

1、设置字符集编码方式:

      编写过滤器类:实现接口javax.servlet.Filter

public class CharacterEncodingFilter implements Filter {    private String charset;    public void destroy() {        // TODO Auto-generated method stub        
    }    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain filterChain) throws IOException, ServletException {        // TODO Auto-generated method stub        request.setCharacterEncoding(charset);
        filterChain.doFilter(request, response);
    }    public void init(FilterConfig config) throws ServletException {        // TODO Auto-generated method stub
        charset = config.getInitParameter("charset");
    }

}

标注:

  以上过滤器类只能保证post提交方式能正确解码,get方式依然会出问题。

方案1:

String username = new String(request.getParamter("userName").getBytes("ISO8859-1"),"GBK")

此方法在接受页面上能够对post和get两种方式传过来的参数userName进行正确显示,但每个参数都使用这种方式来接受会太麻烦,所以还是使用过滤器的方式比较方便。

方案2:

对于get接受参数的解决方法:修改服务器的配置文件中

修该tomcat服务器的安装目录(E:/Program Files/Apache Software Foundation/Tomcat 6.0/conf)下的server.xml

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>

标注:添加属性 URIEncoding="GBK" ,此方式只能解决get方式提交。

2、检测用户是否登陆的过滤器

 

public class CheckLoginFilter implements Filter {    public void destroy() {        // TODO Auto-generated method stub        
    }    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {        // TODO Auto-generated method stub
        HttpServletRequest hsRequest = (HttpServletRequest)request;
        HttpServletResponse hsResponse = (HttpServletResponse)response;

        HttpSession session = hsRequest.getSession();        //没登录
        if(session.getAttribute("userID") == null)
        {

            String uri = hsRequest.getRequestURI();            // 请求登录页面
            if (uri.contains("log")||uri.contains("Log") || 
                    uri.contains("reg") || uri.contains("Reg")) {
                chain.doFilter(request, response);
            }else {            // 请求其它页面
                hsResponse.sendRedirect("login.jsp");
            }

        }else {            // 已登录,顺利跳转            chain.doFilter(request, response);
        }
    }    public void init(FilterConfig arg0) throws ServletException {        // TODO Auto-generated method stub
    }

}

 

(二)配置web.xml

    
    CharacterEncodingFilter<filter-class>cn.guopeng.bbs.filter.CharacterEncodingFilterclass>charsetGBKCharacterEncodingFilter/*CheckLoginFiltercn.guopeng.bbs.filter.CheckLoginFilterCheckLoginFilter/*

标注:

(1)想过滤多个页面并且不全部过滤,

    如果过滤或不过滤的地址比较有规律可以配置为全部过滤,然后在过滤器中编写代码只过滤一部分,其他的直接请求即可。

    如果规律不明显,则只能通过web.xml配置,可以为过滤类写多个

(2)web.xml 中如果有servlet的配置信息, 那么filter应该在servlet的下面进行配置。

 

上一篇:深入浅出 RPC - 浅出篇


下一篇:内部类