HTML特殊字符过滤器



/**
* HTML标签过滤,防止用户恶意提交带HTML标签的数据
*
* @author liulg
*/
public class HTMLCharacterRequest extends HttpServletRequestWrapper {

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

@Override
public String getParameter(String name) {
String value = super.getParameter(name);
return filter(value);
}

@Override
@SuppressWarnings("unchecked")
public Map getParameterMap() {
Map<String, String[]> map = super.getParameterMap();
Map<String, String[]> map_ = new HashMap<String, String[]>();

Set<Entry<String, String[]>> set = map.entrySet();
Iterator<Entry<String, String[]>> it = set.iterator();
while (it.hasNext()) {
Entry<String, String[]> entry = it.next();
if (entry != null && entry.getValue() != null
&& entry.getValue().length > 0) {
String[] array = new String[entry.getValue().length];
for (int i = 0; i < entry.getValue().length; i++) {
array[i] = filter(entry.getValue()[i]);
}
map_.put(entry.getKey(), array);
}
}
return map_;
}

@Override
public String[] getParameterValues(String name) {
String[] values = super.getParameterValues(name);
if (values == null || values.length == 0)
return values;
for (int i = 0; i < values.length; i++) {
String str = values[i];
values[i] = filter(str);
}
return values;
}

private String filter(String value) {
if (StringUtil.isNotBlank(value)) {
value = value.replaceAll("<", "[").replaceAll(">", "]");
}
return value;
}

}






/**
* 权限访问控制
*
* @author luo
*/
public class PermitFilter implements Filter {

private static Map<String, Object> sysMenusMap = new HashMap<String, Object>();

private static String[] params = null;

private final static String LOGIN_VIEW = "/jsp/index/login.jsp";

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;

String uri = request.getRequestURI();
String contextPath = request.getContextPath();
uri = uri.substring(contextPath.length());

Object obj = request.getSession().getAttribute(Constant.USER_SESSION);


if(obj == null){

//未登录可放行的访问
for (String p : params) {
if (uri.startsWith(p)) {
chain.doFilter(req, resp);
return;
}
}
//aJax访问 (未登录不可放行)
if (request.getHeader("x-requested-with") != null
&& request.getHeader("x-requested-with").equalsIgnoreCase( // ajax超时处理
"XMLHttpRequest")) {
JspUtils.print(response, "timeout");
return;
}
//普通访问 (未登录不可放行)
request.getRequestDispatcher(LOGIN_VIEW).forward(req, resp);

}else{

//是否越权访问
Users user = (Users) obj;
List<Menu> menus = new ArrayList<Menu>(user.getRose().getMenus());

boolean flag =false;
if(sysMenusMap.get(uri) != null){
for (Menu menu : menus) {
if(StringUtil.isNotBlank(menu.getMenuUrl()))
if(uri.equals("/"+menu.getMenuUrl())){
flag=true;
break;
}
}
}else{
chain.doFilter(new HTMLCharacterRequest(request), resp);
return;
}


if(flag){
// chain.doFilter(request, resp);
chain.doFilter(new HTMLCharacterRequest(request), resp);
return;
}else{
JspUtils.print(response, "<script>alert('无权访问');</script>");
return ;
}

}

}

public void init(FilterConfig config) throws ServletException {
params = config.getInitParameter("p").split(",");
RoseDao roseDao = (RoseDao) Springs.getApp().getBean("roseDaoImpl");
List<Menu> sysMenus = roseDao.findAllMenuBy_URL_NOTNULL();
for (Menu menu : sysMenus) {
sysMenusMap.put("/"+menu.getMenuUrl(), menu.getMenuName());
}
}

public void destroy() { }



}

<think>好的,我需要帮助用户解决如何配置Elasticsearch分词器以不过滤特殊字符的问题。首先,我需要回忆一下Elasticsearch中分词器的组成,根据引用内容,分词器由字符过滤器(char_filter)、分词器(tokenizer)和词元过滤器(filter)三部分组成。用户的问题是关于不过滤特殊字符,也就是希望保留特殊符号不被移除或处理。 接下来,用户提到的不过滤特殊字符可能涉及到字符过滤器和词元过滤器的配置。根据引用中的信息,默认的分词器(如standard)可能会过滤掉某些特殊字符,而用户希望自定义分词器来保留这些字符。例如,引用3提到可以通过字符过滤器在中文前后加空格,然后分词器根据空格分词,这说明字符过滤器可以修改输入文本,但用户的需求是保留而非修改特殊字符。 首先,我需要确定如何配置字符过滤器。可能需要使用到mapping字符过滤器来替换或保留特定字符,或者使用html_strip来避免过滤HTML标签。但用户可能希望保留所有特殊字符,包括像$、#等符号。因此,可能需要自定义字符过滤器,不进行任何过滤操作,或者明确保留这些符号。 其次,分词器的选择也很重要。standard分词器会根据Unicode文本分割算法切分文本,可能会将特殊字符作为分隔符处理。如果用户希望特殊字符保留在分词结果中,可能需要调整分词规则。例如,使用whitespace分词器仅根据空格分词,但这样可能无法处理其他情况。或者,自定义正则表达式分词器(pattern tokenizer)来匹配包含特殊字符的词汇。 另外,词元过滤器部分,比如小写过滤器(lowercase)可能会影响字符的大小写,但用户的问题主要在于保留特殊字符,所以可能需要避免使用那些会移除或修改特殊字符过滤器。 根据引用2,分析器类型可以是custom,允许用户自定义分词器。参数包括tokenizer、filter和char_filter。用户需要配置一个自定义分析器,其中可能不需要特定的字符过滤器,或者使用keyword分词器来保留整个输入作为单一词元。但这样可能不符合分词需求,因此需要更细致的调整。 可能的解决方案包括: 1. 使用自定义字符过滤器,例如通过正则表达式保留特殊字符,或者禁用默认的过滤规则。 2. 选择适当的分词器,如使用uax_url_email分词器来处理包含特殊字符的URL或邮箱,但可能不够灵活。 3. 在词元过滤器中避免使用像punctuation这样的过滤器,这些可能会移除标点符号。 例如,配置一个自定义分析器,使用standard分词器,但修改其参数,比如设置split_on_numerics为false,减少对数字的分割影响。或者,在字符过滤器中添加mapping,将某些特殊字符替换为保留版本。但更直接的方法可能是调整分词器的模式,使其包含特殊字符作为词的一部分。 另一个思路是,如果用户希望特殊符号作为单独的词元保留,可以调整分词器的规则,使其将特殊符号视为词素。例如,使用正则表达式分词器,设置匹配包括特殊字符的模式。 总结步骤可能包括: - 创建自定义分析器,选择合适的分词器(如pattern或whitespace),并配置字符过滤器和词元过滤器以保留特殊字符。 - 测试分析器效果,使用_analyze API验证分词结果是否包含特殊字符。 需要确保配置正确,避免误过滤,同时引用相关的参考资料来支持配置方法,如引用2和引用3提到的自定义分析器和字符过滤器的使用。</think>要配置Elasticsearch分词器以保留特殊字符,需通过自定义分析器调整字符过滤器和分词规则。以下是具体步骤: --- ### **1. 自定义分析器配置原理** Elasticsearch分词器由三部分组成: - **字符过滤器(char_filter)**:预处理文本(如移除HTML标签或替换字符) - **分词器(tokenizer)**:按规则切割文本 - **词元过滤器(filter)**:进一步处理分词结果(如转小写、移除停用词) 要保留特殊字符,需避免过滤操作,并调整分词逻辑[^2][^3]。 --- ### **2. 配置方法示例** #### **场景1:保留所有特殊字符** ```json PUT /custom_index { "settings": { "analysis": { "analyzer": { "my_custom_analyzer": { "type": "custom", "tokenizer": "standard", // 使用标准分词器 "char_filter": [], "filter": ["lowercase"] // 可选:仅保留小写转换,不添加其他过滤器 } } } } } ``` - **说明**:标准分词器(`standard`)默认会保留部分特殊字符(如`$`、`_`),但会过滤部分符号(如`#`)。需进一步调整字符过滤器。 #### **场景2:完全保留特殊符号(如`#`、`@`)** ```json PUT /custom_index { "settings": { "analysis": { "char_filter": { "my_char_filter": { "type": "mapping", "mappings": [ // 显式保留特定符号 "\\# => _keep_hash_", "\\@ => _keep_at_" ] } }, "analyzer": { "my_custom_analyzer": { "type": "custom", "tokenizer": "keyword", // 将整个输入作为单个词元 "char_filter": ["my_char_filter"], "filter": [] } } } } } ``` - **说明**:使用`keyword`分词器将整个文本作为单一词元,并通过映射字符过滤器保留特定符号[^3]。 --- ### **3. 验证分词效果** 通过`_analyze` API测试: ```json GET /custom_index/_analyze { "analyzer": "my_custom_analyzer", "text": "程序员#elasticsearch@2024" } ``` - **预期输出**:`["程序员#elasticsearch@2024"]`(保留所有特殊字符) --- ### **4. 扩展配置建议** - **使用正则分词器**:通过`pattern`分词器自定义切割规则: ```json "tokenizer": { "my_pattern_tokenizer": { "type": "pattern", "pattern": "[^\\w#@]+", // 按非单词字符(排除#和@)分词 "group": -1 } } ``` - **禁用HTML过滤**:若需保留HTML标签,移除`char_filter`中的`html_strip`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值