java利用过滤器实现编码的转换,内容输出的替换

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

在页面建个表单

<formaction="login.do"method="post"><inputtype="text"name="username"/><inputtype="submit"value="确定"/></form>

建个servlet

web.xml

<servlet><servlet-name>LoginServlert</servlet-name><servlet-class>servlet.LoginServlert</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlert</servlet-name><url-pattern>/login.do</url-pattern></servlet-mapping>

packageservlet;importjava.io.IOException;importjava.io.PRintWriter;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassLoginServlertextendsHttpServlet {publicLoginServlert() {super();

}publicvoiddestroy() {super.destroy();

}publicvoiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {

doPost(request, response);

}publicvoiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {

String username= request.getParameter("username");

System.out.println("获取的username:>>>>>>"+username);

}publicvoidinit()throwsServletException {

}

}

后台情况是这样的:

乱码了.

可以通过过滤器来解决

新建一个过滤器EncodingFilter.java

packagefilter;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletRequest;publicclassEncodingFilterimplementsFilter{privateString encoding = "";privateString filterName = "";publicvoidinit(FilterConfig filterConfig)throwsServletException {

encoding= filterConfig.getInitParameter("encoding");

filterName=filterConfig.getFilterName();if(encoding ==null|| "".equals(encoding)) {

encoding= "UTF-8";

}

System.out.println("获得编码值......");

}publicvoiddoFilter(ServletRequest request, ServletResponse res,

FilterChain chain)throwsIOException, ServletException {

HttpServletRequest req=(HttpServletRequest)request;

System.out.println("请求被" + filterName + "过滤了.......");//分别对请求和响应进行编码设置request.setCharacterEncoding(encoding);

res.setCharacterEncoding(encoding);

chain.doFilter(req, res);

System.out.println("响应被被" + filterName + "过滤了.......");

}publicvoiddestroy() {

System.out.println("请求被销毁......");

}

}

在web.xml中配置filter

<filter><filter-name>EncodingFilter</filter-name><filter-class>filter.EncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>EncodingFilter</filter-name><url-pattern>*.do</url-pattern></filter-mapping>

跑起来:

正常了.

我们换在地址栏里输入汉字,看看是否乱码.

结果是这样的

过滤器不起作用了,怎么办.

其实request.setCharacterEncoding(encoding);只对消息体中的数据起作用,对url中的参数不起作用了.

对上面的过滤器进行优化.

编写RequestEncodingWrapper.java

packagefilter;importjava.io.UnsupportedEncodingException;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletRequestWrapper;publicclassRequestEncodingWrapperextendsHttpServletRequestWrapper {privateString encoding = "";publicRequestEncodingWrapper(HttpServletRequest request) {//必须调用父类构造方法super(request);

}publicRequestEncodingWrapper(HttpServletRequest request,String encoding){//必须调用父类构造方法super(request);this.encoding=encoding;

}

@OverridepublicString getParameter(String name) {

String value=getRequest().getParameter(name);try{//将参数值进行编码转换if(value!=null&&!"".equals(value)){

value=newString(value.trim().getBytes("iso-8859-1"),encoding);

}

}catch(UnsupportedEncodingException e) {

e.printStackTrace();

}returnvalue;

}

}

优化EncodingFilter.java后

packagefilter;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletRequest;publicclassEncodingFilterimplementsFilter {privateString encoding = "";privateString filterName = "";publicvoidinit(FilterConfig filterConfig)throwsServletException {

encoding= filterConfig.getInitParameter("encoding");

filterName=filterConfig.getFilterName();if(encoding ==null|| "".equals(encoding)) {

encoding= "UTF-8";

}

System.out.println("获得编码值......");

}publicvoiddoFilter(ServletRequest request, ServletResponse response,

FilterChain chain)throwsIOException, ServletException {

HttpServletRequest req=(HttpServletRequest)request;

System.out.println("请求被" + filterName + "过滤了.......");if("GET".equals(req.getMethod())){

req=newRequestEncodingWrapper(req,encoding);

}else{

request.setCharacterEncoding(encoding);

}//分别对请求和响应进行编码设置response.setCharacterEncoding(encoding);

chain.doFilter(req, response);

System.out.println("响应被被" + filterName + "过滤了.......");

}publicvoiddestroy() {

System.out.println("请求被销毁......");

}

}

好了.

Filter接口有三个方法:

init(FilterConfig filterConfig)初始化过滤器,filterConfig参数可以得到过滤器初始化的配置参数信息.

doFilter(ServletRequest request, ServletResponse res,FilterChain chain)

request表示客户端的请求,rewponse表示对应请求的响应,chain是过滤器对象,.在该方法中的特定过滤器完成后,

可调用doFilter请求传给过滤器中的下一个过滤器,也可以直接返回响应内容,还可以将目标重定向.

destroy():释放过滤器中使用的资源.

参数FilterConfig filterConfig有四个方法:

public String getFilterName()得到过滤器的名字

public String getInitParameter(String name)得到过滤器中初始化的参数值.

publi Enumeration getInitParameterNames()得到过滤器配置中的所有初始化参数名字的枚举类型.

publi ServletContext getServlet()得到Servlet上下文对象.

说完了请求,我们再来说说响应.

我们经常需要在向浏览器输出内容时,过滤一些敏感词汇.

新建一个内容替换的封装器ResponseReplaeWrapper.java

packagefilter;importjava.io.CharArrayWriter;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpServletResponseWrapper;publicclassResponseReplaeWrapperextendsHttpServletResponseWrapper {privateCharArrayWriter charWriter =newCharArrayWriter();publicResponseReplaeWrapper(HttpServletResponse response){//必须调用父类构造方法super(response);

}publicPrintWriter getWriter()throwsIOException{//返回字符数组Writer,缓存内容returnnewPrintWriter(charWriter);

}publicCharArrayWriter getCharWriter(){returncharWriter;

}

}

过滤器:

packagefilter;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.Properties;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletResponse;publicclassReplaceFilterimplementsFilter {privateProperties propert =newProperties();publicvoidinit(FilterConfig filterConfig)throwsServletException {

System.out.println("ReplaceFilter init.....");//通过filterConfig获得初始胡文件名String filePath = filterConfig.getInitParameter("filePath");try{//导入资源文件propert.load(ReplaceFilter.class.getClassLoader()

.getResourceAsStream(filePath));

}catch(FileNotFoundException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}

}publicvoiddoFilter(ServletRequest request, ServletResponse response,

FilterChain chain)throwsIOException, ServletException {

HttpServletResponse res=(HttpServletResponse) response;//实例化响应器包装类ResponseReplaeWrapper resp =newResponseReplaeWrapper(res);

chain.doFilter(request, resp);//缓存输出字符String outString =resp.getCharWriter().toString();//循环替换不合法的字符for(Object o : propert.keySet()) {

String key=(String) o;

outString=outString.replace(key, propert.getProperty(key));

}//利用原先的HttpServletResponse输出字符PrintWriter out =res.getWriter();

out.write(outString);

}publicvoiddestroy() {

System.out.println("ReplaceFilter destroy......");

}

}

在web.xml中配置过滤器

<filter><filter-name>ReplaceFilter</filter-name><filter-class>filter.ReplaceFilter</filter-class><init-param><param-name>filePath</param-name><param-value>/replace_ZH.properties</param-value></init-param></filter><filter-mapping><filter-name>ReplaceFilter</filter-name><url-pattern>*.do</url-pattern></filter-mapping>

在src下新建配置文件replace_ZH.properties

建个测试的servlet

packageservlet;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassResponseServletextendsHttpServlet {publicResponseServlet() {super();

}publicvoiddestroy() {super.destroy();//Just puts "destroy" string in log//Put your code here}publicvoiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {

response.setContentType("text/html");

PrintWriter out=response.getWriter();

out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");

out.println("<HTML>");

out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");

out.println(" <BODY>");

out.println("思思博士<br/>色情<br/>赌博<br/>dfdffddf");/*out.print(" This is ");

out.print(this.getClass());

out.println(", using the GET method");*/out.println(" </BODY>");

out.println("</HTML>");

out.flush();

out.close();

}publicvoiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {

response.setContentType("text/html");

PrintWriter out=response.getWriter();

out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");

out.println("<HTML>");

out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");

out.println(" <BODY>");

out.print(" This is ");

out.print(this.getClass());

out.println(", using the POST method");

out.println(" </BODY>");

out.println("</HTML>");

out.flush();

out.close();

}publicvoidinit()throwsServletException {

}

}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航