java利用过滤器实现编码的转换,内容输出的替换
在页面建个表单
<form action="login.do" method="post">
<input type="text" name="username" />
<input type="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>
package servlet; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class LoginServlert extends HttpServlet {
public LoginServlert() {
super();
}
public void destroy() {
super.destroy();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
System.out.println("获取的username:>>>>>>"+username);
}
public void init() throws ServletException {
}
}
后台情况是这样的:
乱码了.
可以通过过滤器来解决
新建一个过滤器EncodingFilter.java
package filter; import java.io.IOException; 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; public class EncodingFilter implements Filter{
private String encoding = "";
private String filterName = ""; public void init(FilterConfig filterConfig) throws ServletException {
encoding = filterConfig.getInitParameter("encoding");
filterName = filterConfig.getFilterName();
if (encoding == null || "".equals(encoding)) {
encoding = "UTF-8";
}
System.out.println("获得编码值......"); } public void doFilter(ServletRequest request, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
System.out.println("请求被" + filterName + "过滤了.......");
// 分别对请求和响应进行编码设置
request.setCharacterEncoding(encoding);
res.setCharacterEncoding(encoding);
chain.doFilter(req, res);
System.out.println("响应被被" + filterName + "过滤了.......");
} public void destroy() {
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
package filter; import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper; public class RequestEncodingWrapper extends HttpServletRequestWrapper {
private String encoding = ""; public RequestEncodingWrapper(HttpServletRequest request) {
// 必须调用父类构造方法
super(request);
}
public RequestEncodingWrapper(HttpServletRequest request,String encoding){
// 必须调用父类构造方法
super(request);
this.encoding=encoding;
} @Override
public String getParameter(String name) {
String value=getRequest().getParameter(name);
try {
//将参数值进行编码转换
if(value!=null&&!"".equals(value)){
value=new String(value.trim().getBytes("iso-8859-1"),encoding);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return value;
} }
优化EncodingFilter.java后
package filter; import java.io.IOException; 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; public class EncodingFilter implements Filter {
private String encoding = "";
private String filterName = ""; public void init(FilterConfig filterConfig) throws ServletException {
encoding = filterConfig.getInitParameter("encoding");
filterName = filterConfig.getFilterName();
if (encoding == null || "".equals(encoding)) {
encoding = "UTF-8";
}
System.out.println("获得编码值......"); } public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
System.out.println("请求被" + filterName + "过滤了.......");
if("GET".equals(req.getMethod())){
req=new RequestEncodingWrapper(req,encoding);
}else {
request.setCharacterEncoding(encoding);
}
// 分别对请求和响应进行编码设置
response.setCharacterEncoding(encoding);
chain.doFilter(req, response);
System.out.println("响应被被" + filterName + "过滤了.......");
} public void destroy() {
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
package filter; import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper; public class ResponseReplaeWrapper extends HttpServletResponseWrapper {
private CharArrayWriter charWriter = new CharArrayWriter();
public ResponseReplaeWrapper(HttpServletResponse response){
//必须调用父类构造方法
super(response);
}
public PrintWriter getWriter() throws IOException{
//返回字符数组Writer,缓存内容
return new PrintWriter(charWriter);
}
public CharArrayWriter getCharWriter(){
return charWriter;
} }
过滤器:
package filter; import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties; 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.HttpServletResponse; public class ReplaceFilter implements Filter {
private Properties propert = new Properties(); public void init(FilterConfig filterConfig) throws ServletException {
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();
}
} public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse res = (HttpServletResponse) response;
// 实例化响应器包装类
ResponseReplaeWrapper resp = new ResponseReplaeWrapper(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);
} public void destroy() {
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
package servlet; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ResponseServlet extends HttpServlet {
public ResponseServlet() {
super();
} public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
} public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, 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();
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, 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();
} public void init() throws ServletException {
} }
java利用过滤器实现编码的转换,内容输出的替换的更多相关文章
- 理清Java中的编码解码转换
1.字符集及编码方式 概括:字符编码方式及大端小端 详细:彻底理解字符编码 可以通过Charset.availableCharsets()获取Java支持的字符集,以JDK8为例,得到其支持的字符集: ...
- 利用JAXB实现java实体类和xml互相转换
1.应用场景 在使用WebService实现数据上传下载,数据查询时,可以利用JAXB实现java实体类和xml互相转换 2.Demo 2.1 student.java 实体类,包含list(set同 ...
- 利用Java位运算符,完成Unsigned转换(无符号)
方案二:利用Java位运算符,完成Unsigned转换. 正常情况下,Java提供的数据类型是有符号signed类型的,可以通过位运算的方式得到它们相对应的无符号值,参见几个方法中的代码: publi ...
- 【Java基础专题】编码与乱码(05)---GBK与UTF-8之间的转换
原文出自:http://www.blogjava.net/pengpenglin/archive/2010/02/22/313669.html 在很多论坛.网上经常有网友问" 为什么我使用 ...
- java 利用spring JavaMailSenderImpl发送邮件,支持普通文本、附件、html、velocity模板
java 利用spring JavaMailSenderImpl发送邮件,支持普通文本.附件.html.velocity模板 博客分类: Java Spring 本文主要介绍利用JavaMailS ...
- 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题
这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...
- java中的字符编码方式
1. 问题由来 面试的时候被问到了各种编码方式的区别,结果一脸懵逼,这个地方集中学习一下. 2. 几种字符编码的方式 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符 ...
- Java web中常见编码乱码问题(二)
根据上篇记录Java web中常见编码乱码问题(一), 接着记录乱码案例: 案例分析: 2.输出流写入内容或者输入流读取内容时乱码(内容中有中文) 原因分析: a. 如果是按字节写入或读取时乱码, ...
- 深入分析Java Web中的编码问题
编码问题一直困扰着我,每次遇到乱码或者编码问题,网上一查,问题解决了,但是实际的原理并没有搞懂,每次遇到,都是什么头疼. 决定彻彻底底的一次性解决编码问题. 1.为什么要编码 计算机的基本单元是字节, ...
随机推荐
- xunsearch安装配置
1.wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2 2.tar -xjf xunsearch-full-lat ...
- Jenkins初探
最近搞搞接口测试,Postman脚本搞好了,但是每次都要手动运行,是不是太low了?Yes,it is. 最近好多人都在用Jenkins搞自动化部署集成之类的,我也凑热闹搞一下. 前提: 1. 已经安 ...
- android 旋转手机的时候,如何忽略onCreate再次被系统调用?
实现一个程序,主要是不想在手机横竖屏的时候重新onCreate,所以在配置文件中增加了配置选项: android:configChanges="orientation|keyboardHid ...
- 关于android中EditText边框的问题 下划线
方法1 将edittext的style设置成?android:attr/textViewStyle 取消掉默认的样式,在设置background为@null 接下来就是一个空空的edittext了, ...
- android数据存储之Sqlite(一)
SQLite学习笔记 1. Sqlite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低 ...
- C语言中的数组和指针以及字符串
数组名同时也是该数组首元素的地址,而指针提供了一种用来使用地址的符号方法,因此指针能够很有效地处理数组. 将一个整数加给指针,这个整数会和指针所指类型的字节数相乘,然后所得的结果会加到初始地址上 da ...
- Android monkey介绍
Android monkey介绍 原文地址 1 简略 monkey是android下自动化测试比较重要的的一个工具,该工具可以运行在host端或者设备(模拟器或真实设备).它会向系统发送随机事件流(即 ...
- jquery读取csv文件并用json格式输出
直接贴上代码: <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Untit ...
- IntelliJ IDEA使用SSH功能
Tools→Start SSH session... 选择Edit credentials... 输入SSH登录信息即可 输入SSH登录信息,Port默认为22 来自为知笔记(Wiz)
- bzoj2178: 圆的面积并
Description 给出N个圆,求其面积并 Input 先给一个数字N ,N< = 1000 接下来是N行是圆的圆心,半径,其绝对值均为小于1000的整数 Output 面积并,保留三位小数 ...