jsp\java如何编写过滤器过滤特殊字符
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jsp\java如何编写过滤器过滤特殊字符相关的知识,希望对你有一定的参考价值。
数据库中带单引号的字符串显示到jsp中时会引起页面显示异常,js方法不能触发的异常,想写个过滤器解决jsp以及sql中的特殊字符转移
package com.jingdu.common;import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class IllegalCharacterFilter implements Filter
private String[] characterParams = null;
private boolean OK=true;
public void init(FilterConfig config) throws ServletException
// if(config.getInitParameter("characterParams").length()<1)
// OK=false;
// else
// this.characterParams = config.getInitParameter("characterParams").split(",");
System.out.println("初始化");
@SuppressWarnings("unchecked")
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain arg2) throws IOException, ServletException
HttpServletRequest servletrequest = (HttpServletRequest) request;
HttpServletResponse servletresponse = (HttpServletResponse) response;
String param = "";
String paramValue = "";
//设置请求编码格式
servletresponse.setContentType("text/html");
servletresponse.setCharacterEncoding("UTF-8");
servletrequest.setCharacterEncoding("UTF-8");
java.util.Enumeration params = request.getParameterNames();
//循环读取参数
while (params.hasMoreElements())
param = (String) params.nextElement(); //获取请求中的参数
String[] values = servletrequest.getParameterValues(param);//获得每个参数对应的值
for (int i = 0; i < values.length; i++)
paramValue = values[i];
//转换目标字符变成对象字符,可以多个。后期扩展特殊字符库用于管理
paramValue = paramValue.replaceAll("'","");
paramValue = paramValue.replaceAll("@","");
paramValue = paramValue.replaceAll("胡锦涛","***");
//这里还可以增加,如领导人 自动转义成****,可以从数据库中读取非法关键字。
values[i] = paramValue;
//把转义后的参数重新放回request中
request.setAttribute(param, paramValue);
//继续向下 执行请求,如果有其他过滤器则执行过滤器
arg2.doFilter(request, response);
public void destroy()
// TODO Auto-generated method stub
参考技术A 例如
String a=uhdalhfhdsfusa'cjksjc'cd;
a=a.replace("'", "");
System.out.print(a);
输出结果:uhdalhfhdsfusacjksjccd
replace("要过滤掉的字符","要替换的字符(可以为空格)"); 参考技术B 正则表达式来校验:过滤器就百度一大堆,怎么写正则表达式,也可以百度,不知你说的特殊字符是什么字符,所以只能给方法追问
主要是单引号,比如输入框输入单引号,再传递这个值给另一个jsp页面时,需要转义为´,传给后台还要转回来,再转为数据库格式:两个单引号;所以字段都这样转太麻烦了,你说的正则表达式校验,怎么做?我是初学者,没用过正则表达式,谢谢啦
参考技术C 正则表达式!追问能举个例子吗?谢谢
追答自己去学吧。而且关於你的“数据库中带单引号的字符串显示到jsp中时会引起页面显示异常”这个问题,你放心,数据库保存数据时会自己自动转换的。比如如果是“<”号,数据库会保存为“<”等等。关於什麼单引号保存的,自己建立一转换池转换就好了,当然,这样的话,取值时也得转换。
自己不要想那麼多,先自己多保存几遍试试。
页面间传值的时候我需要转一次,保存到数据库需要转一次;对于少量字段我可以一个一个转换;但是我现在字段非常多,我是想要一个过滤器,而不是教我怎么转
追答第一、对于页面之间的传值、数据库,在编码一致情况下不需要转换;
第二、数据库你存什么,就取什么就OK,根本没你想象那么复杂;
第三,你只是个初学者,就已经觉得要处理的字段多了,像我们这些搞ERP的,有时候要存50多个字段的,按你这样转来转去,我们岂不是要死了?
第四、没有什么所谓的过滤器,那些无非是特殊情况下,要求这么保存,才会用到,无非是声明一个方法,传值进来转换而已,比如:
public String parseString(str)
String string = "";
if(str.containt("<"))
string = "<";
else if()
else
return string;
一切说白了,就是很多问题,你自己想复杂了,胡乱猜想和模拟各种情景,导致数据越处理越复杂,这样下去,项目越往后做,你就越难处理。还是认真再学学JSP吧
不是我自己猜想的呀,是在项目中遇到的呀,现在暂时是这样转的呀,就因为累才想请教你们怎么办的呀,50个字段算多呀,我有好几百字段啊
servlet 过滤器如何识别下一个目标是另一个过滤器还是 servlet/jsp?
【中文标题】servlet 过滤器如何识别下一个目标是另一个过滤器还是 servlet/jsp?【英文标题】:How does a servlets filter identify next destination is another filter or a servlet/jsp? 【发布时间】:2014-07-05 02:31:07 【问题描述】:我们通常会在 web.xml 中为 servlet 中的任何过滤器编写 <url-pattern>/*</url-pattern>
。
<filter-mapping>
<filter-name>requestRedirectorFilter</filter-name>
<url-pattern>/action</url-pattern>
</filter-mapping>`.
现在我的疑问是 java 如何识别下一个 servlet/jsp 是什么?因为我们通过
提出的任何请求request.getRequestDispatcher("/ABCXYZ").forward(request, (HttpServletResponse)servletResponse);
要导航到下一个 servlet/jsp,容器默认会在 web.xml 中搜索。在 web.xml <url-pattern>/*</url-pattern>
中已经存在我们使用的过滤器。正是在这里,实际问题开始了。
如果<url-pattern>/*</url-pattern>
[它就像任何请求的通用接收器] 已经存在于 web.xml 中,那么该容器如何知道跟随 <url-pattern>/ABCXYZ</url-pattern>
而不是 <url-pattern>/*</url-pattern>
?请在这方面分享您的观点和知识。
【问题讨论】:
【参考方案1】:Servlet 匹配过程
一个请求可以匹配给定上下文中的多个 servlet 映射。 servlet 容器使用简单的匹配过程来确定最佳匹配。
匹配过程有四个简单的规则。
首先,容器更喜欢精确路径匹配而不是通配符路径匹配。
其次,容器更喜欢匹配最长的模式。
第三,容器更喜欢路径匹配而不是文件类型匹配。
最后,<url-pattern>/</url-pattern>
模式总是匹配任何没有其他模式匹配的请求。
例如,上下文 web.xml 文件可以将在线目录的主页映射到一种模式,并将目录的搜索页面映射到不同的模式,如下所示:
<servlet-mapping>
<servlet-name>catalogBrowse</servlet-name>
<url-pattern>/Catalog/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>catalogSearch</servlet-name>
<url-pattern>/Catalog/search/*</url-pattern>
</servlet-mapping>
下图说明了上下文的匹配过程。由于容器更喜欢匹配最长模式,因此包含/Catalog/search/
的 URL 始终匹配 catalogSearch 的映射,而不是 catalogBrowse 的映射。
网址模式匹配
如果您对链接不感兴趣,请从以下链接复制。
请查看URL Patterns,其中详细描述了示例。
【讨论】:
您的解释和给出的链接对我有帮助。以上是关于jsp\java如何编写过滤器过滤特殊字符的主要内容,如果未能解决你的问题,请参考以下文章