Java Filter学习流程

问题:前端分页模糊查询时使用%等特殊字符会影响后台生成的sql,进而影响查询结果

解决方法:使用filter来把百分号等特殊字符改为圆角

Filter、FilterChain、FilterConfig 介绍:

http://www.runoob.com/w3cnote/filter-filterchain-filterconfig-intro.html

创建InitFilter类实现Filter,该类会拦截到servlet的请求,FilterChain的doFilter(req, response)方法是继续让service执行,不要忘记调用.

项目加载时初始化调用init方法,发往servlet的请求会经过doFilter方法.

/**
 * 转义特殊字符的filter
 * @author Raines
 *
 */
public class InitFilter implements Filter {
   
   private static Logger log = LoggerFactory.getLogger(InitFilter.class);

   public void init(FilterConfig filterConfig) throws ServletException {

   }

   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
         throws IOException, ServletException {
      XssHttpServletRequestWraper xssRequest = new XssHttpServletRequestWraper((HttpServletRequest) request);
      HttpServletRequest req = (HttpServletRequest)xssRequest;
      User user = (User)req.getSession().getAttribute(SessionInfo.USER);
      if(user == null) {
         log.debug("用户未登录!!!!!!");
         chain.doFilter(req, response);
         return;
      }
      chain.doFilter(req, response);
      return;
   }

   public void destroy() {

   }

}

Filter能在request到达servlet的服务方法之前拦截HttpServletRequest对象,而在服务方法转移控制后又能拦截HttpServletResponse对象。

你可以使用filter来实现特定的任务,比如验证用户输入,以及压缩web内容。但HttpServletRequest对象的参数是不可改变的,这极大地缩减了filter的应用范围。至少在一半的时间里,你希望可以改变准备传送给 filter的对象。
幸运的是,尽管你不能改变不变对象本身,但你却可以通过使用装饰模式来改变其状态。 

import org.apache.commons.lang.StringUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

/**
 * 过滤特殊字符
 * @author Raines
 */
public class XssHttpServletRequestWraper extends HttpServletRequestWrapper {

    public XssHttpServletRequestWraper(HttpServletRequest request) {
        super(request);
    }

    @Override
    public String getParameter(String name) {
        //Constants.MY_LOG.debug("getParameter----->转义处理");
        //return clearXss(super.getParameter(name));// 保留勿删
        return xssEncode(super.getParameter(name));
    }

    @Override
    public String getHeader(String name) {
        //Constants.MY_LOG.debug("getHeader----->转义处理");
        //return clearXss(super.getHeader(name)); // 保留勿删
        return xssEncode(super.getParameter(name));
    }

    @Override
    public String[] getParameterValues(String name) {
        //Constants.MY_LOG.debug("getParameterValues----->转义处理");
        if(!StringUtils.isEmpty(name)){
            String[] values = super.getParameterValues(name);
            if(values != null && values.length > 0){
                String[] newValues = new String[values.length];

                for(int i =0; i< values.length; i++){
                    //newValues[i] = clearXss(values[i]);// 保留勿删
                    newValues[i] = xssEncode(values[i]);
                }
                return newValues;
            }
        }
        return null;
    }

    /**
     *
     * 处理字符转义【勿删,请保留该注释代码】
     * @param value
     * @return
    private String clearXss(String value){
    if (value == null || "".equals(value)) {
    return value;
    }
    value = value.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
    value = value.replaceAll("\\(", "&#40;").replace("\\)", "&#41;");
    value = value.replaceAll("'", "&#39;");
    value = value.replaceAll("eval\\((.*)\\)", "");
    value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
    value = value.replace("script", "");
    return value;
    }*/

    /**
     * 将特殊字符替换为全角
     * @param s
     * @return
     */
    private  String xssEncode(String s) {
        if (s == null || s.isEmpty()) {
            return s;
        }
        s = s.trim();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            switch (c) {
                case '%':
                    sb.append("\\%");// 全角百分号
                    break;
                case '_':
                   if(i == 0 || i == s.length() - 1) {
                       sb.append("\\_");// 全角百分号
                   } else {
                      sb.append(c);
                   }
                    break;
                default:
                    sb.append(c);
                    break;
            }
        }
        return sb.toString();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值