问题:前端分页模糊查询时使用%等特殊字符会影响后台生成的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("<", "<").replaceAll(">", ">");
value = value.replaceAll("\\(", "(").replace("\\)", ")");
value = value.replaceAll("'", "'");
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();
}
}