2 wang3274755 wang3274755 于 2016.05.06 12:06 提问

过滤器过滤特殊字符无法获取到参数

代码如下:

 $.ajax({
                url: url,
                type: 'post',
                data: o,
                cache: false,
                success: function (text) {
                    console.dir(text);
                    CloseWindow("save");
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    alert(jqXHR.responseText);
                    CloseWindow();
                }
            });

我使用ajax方式提交,post提交方式,手动封装data。
后端接收如下:

 @At("/updateProductCfg")
    public ExecuteState updateProductCfg(@Param("..") CmsLoanProduct param,HttpSession session) {
        System.out.print(Json.toJson(param));
        UserObject user=(UserObject)session.getAttribute("userObject");
        param.setUsrModify(user.getUserId());
        param.setOrgModify(user.getUserOrgName());
        param.setDatModify(new Timestamp(System.currentTimeMillis()));
        ExecuteState state = productCfgManagerBiz.updateProductCfg(param);
        return state;
    }

现在如果在param参数中有特殊字符,那么我将定义
web.xml,代码如下

  <filter>
        <filter-name>XssFilter</filter-name>
        <filter-class>com.ifs.frame.filter.XssFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>XssFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

拦截器代码

 public class XssFilter implements Filter {

    FilterConfig filterConfig = null;
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,
            ServletException {
            XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper(
            (HttpServletRequest) request);
            filterChain.doFilter(xssRequest, response);

    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
    }

    @Override
    public void destroy() {
        this.filterConfig=null;
    }

}

XssHttpServletRequestWrapper代码

 public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
    public XssHttpServletRequestWrapper(HttpServletRequest servletRequest) {
        super(servletRequest);
    }
    public String[] getParameterValues(String parameter) {
      String[] values = super.getParameterValues(parameter);
      if (values==null)  {
                  return null;
          }
      int count = values.length;
      String[] encodedValues = new String[count];
      for (int i = 0; i < count; i++) {
                 encodedValues[i] = cleanXSS(values[i]);
       }
      return encodedValues;
    }
    public String getParameter(String parameter) {
          String value = super.getParameter(parameter);
          if (value == null) {
                 return null;
                  }
          return cleanXSS(value);
    }
    public String getHeader(String name) {
        String value = super.getHeader(name);
        if (value == null)
            return null;
        return cleanXSS(value);
    }   
    private String cleanXSS(String value) {
        value = value.replaceAll("&", "&amp;");
        value = value.replaceAll("#", "&#35;");
        value = value.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
        value = value.replaceAll("\"", "&#92;");
        value = value.replaceAll("'", "&#39;");
        return value;
    }

现在这些代码我确无法获取到data中的值,也无法转换,各位有什么好的解决方法吗?

以我现在所知道的是参数未封装到HttpServletRequest里面导致的。但我现在无法在来修改源码了,也只有通过写过滤器来想办法

1个回答

devmiao
devmiao   Ds   Rxr 2016.05.07 06:51
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
filter过滤器过滤特殊字符
主管提出一个需求,
spring mvc获取到的参数附带特殊符号,接收后被转义的处理方法
WEB开发时,在前端通过get / post 方法传递参数的时候  如果实参附带特殊符号,后端接收到的值中特殊符号就会被转义例如该请求: http://localhost:10001/demo/index.do?name=张三(1)注:中文()不会出现此种情况      后台就收到的实际 name 值为:   张三&amp;amp;#40;1&amp;amp;#41;&amp;amp;#40;其实为html中  (  符...
SpringMVC 过滤参数的非法字符
import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestW
Struts过滤器过滤某些字符
(1)天朝的规矩做项目的时候可能需要过滤某些特定的字符,在更多的用途是安全的考虑,下边就是一个过滤字符的简单案例; (2)过滤器代码如下: package com.lc.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import j
java 过滤器(过滤客户端表单特殊字符、服务器端特殊字符、以及编码过滤)
package com.lk.test; import java.io.CharArrayWriter; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletRe
URL请求后台获取不到特殊字符的参数
URL特殊字符需转义 1、空格换成加号(+) 2、正斜杠(/)分隔目录和子目录 3、问号(?)分隔URL和查询 4、百分号(%)制定特殊字符 5、#号指定书签 6、&号分隔参数 如果请求的URL中含有 %- _ . ! ~ * ' ( ) 等转义字符串,后台转义字符的原因:  如果你的表单使用get方法提交,并且提交的参数中有“&”等特殊符的话,如果不
获取ASP.NET下载状态
由于HTTP的无状态协议,导致无法获取到是否已开始下载的情况(当然,只能获取到已开始执行了下载)
url里出现"+"的情况,request.getParameter("")取到的+号为空格
解决方式:对url进行转义,java可使用URLEncoder.encode(url)  ,javaScript 里使用encodeURIComponent(url)
getParameterValues只能取到第一个
叶师傅经常说不要轻看一点小问题,因为小问题可能会引发大问题。比如吃饭,你认识很简单的事,结果牙掉了。 不说了 ,上代码。public static List<SupportSpecTransfersNe> postTransfersList(HttpServletRequest request,HttpServletResponse response,String balkNo,Date add
mysql 特殊字符存取
在mysql中 &字符会被转化成&amp;  比如在存取文件名的时候,文件名包含&符号如: 项目备案表@_艺术&软件_2016年4月30日  存入数据库时就会变成    项目备案表@_艺术&amp;软件_2016年4月30日.xls这时如果直接获取就会出错,可以使用htmlspecialchars_decode就ok了。