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 中的任何过滤器编写 &lt;url-pattern&gt;/*&lt;/url-pattern&gt;

<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 &lt;url-pattern&gt;/*&lt;/url-pattern&gt; 中已经存在我们使用的过滤器。正是在这里,实际问题开始了。

如果&lt;url-pattern&gt;/*&lt;/url-pattern&gt; [它就像任何请求的通用接收器] 已经存在于 web.xml 中,那么该容器如何知道跟随 &lt;url-pattern&gt;/ABCXYZ&lt;/url-pattern&gt; 而不是 &lt;url-pattern&gt;/*&lt;/url-pattern&gt; ?请在这方面分享您的观点和知识。

【问题讨论】:

【参考方案1】:

Servlet 匹配过程

一个请求可以匹配给定上下文中的多个 servlet 映射。 servlet 容器使用简单的匹配过程来确定最佳匹配。

匹配过程有四个简单的规则。

首先,容器更喜欢精确路径匹配而不是通配符路径匹配。

其次,容器更喜欢匹配最长的模式

第三,容器更喜欢路径匹配而不是文件类型匹配。

最后,&lt;url-pattern&gt;/&lt;/url-pattern&gt; 模式总是匹配任何没有其他模式匹配的请求。


例如,上下文 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如何编写过滤器过滤特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

jsp中如何过滤非法字符

java正则表达式过滤特殊字符

JAVA特殊字符过滤方法

java正则表达式 过滤特殊字符 只允许中文、字母和数字, 该怎么写?急。。。

java过滤特殊字符的问题

Java用正则表达式 过滤特殊字符,只允许中文、字母或数字,该怎么写?急。。。。