在网上看了一段字符编码过滤器:
有个问题:web.xml中配置ignore参数有必要么?有什么作用?
java类中变量ignore又有什么作用?
package com.kemp.servlet;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;public class SetCharacterEncodingFilter implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig = null;
protected boolean ignore = true; public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else
this.ignore = false;
} public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO 自动生成方法存根
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
chain.doFilter(request, response);
} public void destroy() {
// TODO 自动生成方法存根
this.encoding = null;
this.filterConfig = null;
} protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}<filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>com.kemp.servlet.SetCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

解决方案 »

  1.   


    package com.framework.common.servlet;import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    public class SetCharacterEncodingFilter implements Filter {
    protected String encoding = null;
    protected FilterConfig filterConfig = null;
    protected boolean ignore = true;
    public void destroy() { this.encoding = null;
    this.filterConfig = null; }
    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException { HttpServletRequest hRequest = (HttpServletRequest) request;
    HttpServletResponse hResponse = (HttpServletResponse) response;
    HttpSession session = hRequest.getSession();

    // Conditionally select and set the character encoding to be used
    if (ignore || (request.getCharacterEncoding() == null)) {
    String encodings = selectEncoding(request);
    if (encodings != null) { try {
    request.setCharacterEncoding(encodings);
    } catch (UnsupportedEncodingException e) { } }
    }
    if (session.getAttribute("userKey") == null) {// session过期,跳到错误页面
    hResponse.sendRedirect(hRequest.getContextPath() +"/common/sessionError.jsp");
    }
    else {
    // Pass control on to the next filter
    chain.doFilter(request, response);
    }
    } public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig;
    this.encoding = filterConfig.getInitParameter("encoding");
    String value = filterConfig.getInitParameter("ignore");
    if (value == null)
    this.ignore = true;
    else if (value.equalsIgnoreCase("true"))
    this.ignore = true;
    else if (value.equalsIgnoreCase("yes"))
    this.ignore = true;
    else
    this.ignore = false; } protected String selectEncoding(ServletRequest request) { return (this.encoding); }}//EOC<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
    <web-app>
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    /WEB-INF/classes/applicationContext-framework.xml,/WEB-INF/classes/applicationContext-cqh.xml,/WEB-INF/classes/applicationContext-zhq.xml
    </param-value>
    </context-param>
    <context-param>
    <param-name>notesAction</param-name>
    <param-value>http://10.151.15.244/names.nsf</param-value>
    </context-param>

    <!-- Encoding Filter Declaration Start -->
    <filter>
    <filter-name>Set Character Encoding</filter-name>
    <filter-class>
    com.framework.common.servlet.SetCharacterEncodingFilter
    </filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>GBK</param-value>
    </init-param>
    <init-param>
    <param-name>ignore</param-name>
    <param-value>true</param-value>
    </init-param>
    </filter>
    <!-- Encoding Filter Mapping Start-->
    <filter-mapping>
    <filter-name>Set Character Encoding</filter-name>
    <servlet-name>action</servlet-name>
    </filter-mapping>
    <filter-mapping>
    <filter-name>Set Character Encoding</filter-name>
    <url-pattern>/jsp/*</url-pattern>
    </filter-mapping>

    <!-- Encoding Filter Mapping End -->

    <listener>
    <listener-class>
    org.springframework.web.context.ContextLoaderListener
    </listener-class>
    </listener>
    <listener>
    <listener-class>
    com.framework.common.listener.TimerListener
    </listener-class>
    </listener> <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>
    org.apache.struts.action.ActionServlet
    </servlet-class>
    <init-param>
    <param-name>config</param-name>
    <param-value>/WEB-INF/struts-config.xml,/WEB-INF/struts-config-cqh.xml,/WEB-INF/struts-config-zhq.xml</param-value>
    </init-param>
    <init-param>
    <param-name>debug</param-name>
    <param-value>2</param-value>
    </init-param>
    <init-param>
    <param-name>detail</param-name>
    <param-value>2</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
    </servlet>
    <servlet>
    <servlet-name>login</servlet-name>
    <servlet-class>
    com.framework.common.servlet.Login
    </servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.shtml</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
    <servlet-name>login</servlet-name>
    <url-pattern>/login</url-pattern>
    </servlet-mapping>

    <session-config>
    <session-timeout>30</session-timeout>
    </session-config>

    <welcome-file-list>
    <welcome-file>/login.jsp</welcome-file>
    </welcome-file-list> <taglib>
    <taglib-uri>struts-bean</taglib-uri>
    <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>struts-html</taglib-uri>
    <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>struts-logic</taglib-uri>
    <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>struts-template</taglib-uri>
    <taglib-location>/WEB-INF/struts-template.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>struts-tiles</taglib-uri>
    <taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>struts-nested</taglib-uri>
    <taglib-location>/WEB-INF/struts-nested.tld</taglib-location>
    </taglib>
    </web-app>
    这是我配置的...
      

  2.   

    这里ignore的意思是:如果为true,则任何时候,均忽略request的自身编码,而强制使用
    <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>配置的编码进行转换。如果为false,则只有request编码为空的时候,才按配置进行编码转换。web.xml中的配置项,最终就被设置到Filter类的对应属性上了,所以Web.xml和java中的ignore是一个东西。
      

  3.   

    web.xml里的:
    <init-param>
          <description>是否忽略默认编码设置</description>
          <param-name>ignore</param-name>
          <param-value>false</param-value>
    </init-param>