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的下面进行配置。

 

你可能感兴趣的:(java)