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.为什么要编码 计算机的基本单元是字节, ...
随机推荐
- dwr使用步骤
DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码使用运行在 ...
- linux xargs参数
xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从 ...
- C语言常用的小代码
圆周率Pi tan(Pi/4)=1 => Pi=4*arctan(1) 反正切函数arctan()在C语言里表示为atan(),为保证精度取圆周率的代码如下: const double Pi = ...
- Android 抽屉类SlidingDrawer的使用
比较简单,设置好SlidingDrawer控件的handle和content属性就可以了. android:content="@+id/content" android:ha ...
- 【转】如何使用PhoneGap打包Web App
如何使用PhoneGap打包Web App 最近做了一款小游戏,定位是移动端访问,思来想去最后选择了jQuery mobile最为框架,制作差不多以后,是否可以打包成App,恰好以前对PhoneGap ...
- update openssl on redhat/centos
$ openssl versionOpenSSL 1.0.1e-fips 11 Feb 2013 $ yum list |grep opensslopenssl.x86_64 1.0.1e-16.el ...
- c++的历史-异常
1.异常出现的目的 在c++语言的设计和演化中,Bjarne Stroustrup说过异常的设计假定如下情况: 基本上是为了处理错误 与函数定义相比,异常处理是很少的 与函数调用相比,异常出现的频率较 ...
- python 深入理解 赋值、引用、拷贝、作用域
在 python 中赋值语句总是建立对象的引用值,而不是复制对象.因此,python 变量更像是指针,而不是数据存储区域, 这点和大多数 OO 语言类似吧,比如 C++.java 等 ~ 1.先来看个 ...
- SVN在团队项目中的使用技巧:[2]Tag操作
SVN是Subversion的简称,是一个开放源代码的版本控制系统 本节讲述SVN使用中的TAG操作 文中若有错误或不足之处,欢迎留言指正 工具/原料 电脑 SVN 方法/步骤 1.认识SVN中T ...
- 如何缩短SQL Server 的启动时间
将/nosplash添加到SQLServer Manageement Studio的快捷方式可以缩短启动时间.为此,右击SSMS快捷方式(位于你的桌面上.start菜单中或任务栏中)并选择Proper ...