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

转自:http://blog.csdn.net/guopengzhang/article/details/5557096

(一)过滤器类编写。 

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

    
    <filter>   
        <filter-name>CharacterEncodingFilter</filter-name>   
        <filter-class>cn.guopeng.bbs.filter.CharacterEncodingFilter</filter-class> 
        <init-param>
            <param-name>charset</param-name>
            <param-value>GBK</param-value>
        </init-param>
    </filter>   
    <filter-mapping>  
        <filter-name>CharacterEncodingFilter</filter-name>   
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>CheckLoginFilter</filter-name>   
        <filter-class>cn.guopeng.bbs.filter.CheckLoginFilter</filter-class>   
    </filter>   
    <filter-mapping>   
        <filter-name>CheckLoginFilter</filter-name>   
        <url-pattern>/*</url-pattern>
    </filter-mapping>

标注:

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

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

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

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

原文地址:https://www.cnblogs.com/tv151579/p/3133002.html