在页面建个表单

  1. <form action="login.do" method="post">
  2. <input type="text" name="username" />
  3. <input type="submit" value="确定" />
  4. </form>

建个servlet

web.xml

  1. <servlet>
  2. <servlet-name>LoginServlert</servlet-name>
  3. <servlet-class>servlet.LoginServlert</servlet-class>
  4. </servlet>
  5.  
  6. <servlet-mapping>
  7. <servlet-name>LoginServlert</servlet-name>
  8. <url-pattern>/login.do</url-pattern>
  9. </servlet-mapping>
  1. package servlet;
  2.  
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  5.  
  6. import javax.servlet.ServletException;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10.  
  11. public class LoginServlert extends HttpServlet {
  12. public LoginServlert() {
  13. super();
  14. }
  15. public void destroy() {
  16. super.destroy();
  17. }
  18. public void doGet(HttpServletRequest request, HttpServletResponse response)
  19. throws ServletException, IOException {
  20. doPost(request, response);
  21. }
  22. public void doPost(HttpServletRequest request, HttpServletResponse response)
  23. throws ServletException, IOException {
  24. String username = request.getParameter("username");
  25. System.out.println("获取的username:>>>>>>"+username);
  26. }
  27. public void init() throws ServletException {
  28. }
  29. }

后台情况是这样的:

乱码了.

可以通过过滤器来解决

新建一个过滤器EncodingFilter.java

  1. package filter;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.Filter;
  6. import javax.servlet.FilterChain;
  7. import javax.servlet.FilterConfig;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.ServletRequest;
  10. import javax.servlet.ServletResponse;
  11. import javax.servlet.http.HttpServletRequest;
  12.  
  13. public class EncodingFilter implements Filter{
  14. private String encoding = "";
  15. private String filterName = "";
  16.  
  17. public void init(FilterConfig filterConfig) throws ServletException {
  18. encoding = filterConfig.getInitParameter("encoding");
  19. filterName = filterConfig.getFilterName();
  20. if (encoding == null || "".equals(encoding)) {
  21. encoding = "UTF-8";
  22. }
  23. System.out.println("获得编码值......");
  24.  
  25. }
  26.  
  27. public void doFilter(ServletRequest request, ServletResponse res,
  28. FilterChain chain) throws IOException, ServletException {
  29. HttpServletRequest req=(HttpServletRequest)request;
  30. System.out.println("请求被" + filterName + "过滤了.......");
  31. // 分别对请求和响应进行编码设置
  32. request.setCharacterEncoding(encoding);
  33. res.setCharacterEncoding(encoding);
  34. chain.doFilter(req, res);
  35. System.out.println("响应被被" + filterName + "过滤了.......");
  36. }
  37.  
  38. public void destroy() {
  39. System.out.println("请求被销毁......");
  40. }
  41. }

在web.xml中配置filter

  1. <filter>
  2. <filter-name>EncodingFilter</filter-name>
  3. <filter-class>filter.EncodingFilter</filter-class>
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>utf-8</param-value>
  7. </init-param>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>EncodingFilter</filter-name>
  11. <url-pattern>*.do</url-pattern>
  12. </filter-mapping>

跑起来:

正常了.

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

结果是这样的

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

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

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

编写RequestEncodingWrapper.java

  1. package filter;
  2.  
  3. import java.io.UnsupportedEncodingException;
  4.  
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletRequestWrapper;
  7.  
  8. public class RequestEncodingWrapper extends HttpServletRequestWrapper {
  9. private String encoding = "";
  10.  
  11. public RequestEncodingWrapper(HttpServletRequest request) {
  12. // 必须调用父类构造方法
  13. super(request);
  14. }
  15. public RequestEncodingWrapper(HttpServletRequest request,String encoding){
  16. // 必须调用父类构造方法
  17. super(request);
  18. this.encoding=encoding;
  19. }
  20.  
  21. @Override
  22. public String getParameter(String name) {
  23. String value=getRequest().getParameter(name);
  24. try {
  25. //将参数值进行编码转换
  26. if(value!=null&&!"".equals(value)){
  27. value=new String(value.trim().getBytes("iso-8859-1"),encoding);
  28. }
  29. } catch (UnsupportedEncodingException e) {
  30. e.printStackTrace();
  31. }
  32. return value;
  33. }
  34.  
  35. }

优化EncodingFilter.java后

  1. package filter;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.Filter;
  6. import javax.servlet.FilterChain;
  7. import javax.servlet.FilterConfig;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.ServletRequest;
  10. import javax.servlet.ServletResponse;
  11. import javax.servlet.http.HttpServletRequest;
  12.  
  13. public class EncodingFilter implements Filter {
  14. private String encoding = "";
  15. private String filterName = "";
  16.  
  17. public void init(FilterConfig filterConfig) throws ServletException {
  18. encoding = filterConfig.getInitParameter("encoding");
  19. filterName = filterConfig.getFilterName();
  20. if (encoding == null || "".equals(encoding)) {
  21. encoding = "UTF-8";
  22. }
  23. System.out.println("获得编码值......");
  24.  
  25. }
  26.  
  27. public void doFilter(ServletRequest request, ServletResponse response,
  28. FilterChain chain) throws IOException, ServletException {
  29. HttpServletRequest req=(HttpServletRequest)request;
  30. System.out.println("请求被" + filterName + "过滤了.......");
  31. if("GET".equals(req.getMethod())){
  32. req=new RequestEncodingWrapper(req,encoding);
  33. }else {
  34. request.setCharacterEncoding(encoding);
  35. }
  36. // 分别对请求和响应进行编码设置
  37. response.setCharacterEncoding(encoding);
  38. chain.doFilter(req, response);
  39. System.out.println("响应被被" + filterName + "过滤了.......");
  40. }
  41.  
  42. public void destroy() {
  43. System.out.println("请求被销毁......");
  44. }
  45.  
  46. }

好了.

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

  1. package filter;
  2.  
  3. import java.io.CharArrayWriter;
  4. import java.io.IOException;
  5. import java.io.PrintWriter;
  6.  
  7. import javax.servlet.http.HttpServletResponse;
  8. import javax.servlet.http.HttpServletResponseWrapper;
  9.  
  10. public class ResponseReplaeWrapper extends HttpServletResponseWrapper {
  11. private CharArrayWriter charWriter = new CharArrayWriter();
  12. public ResponseReplaeWrapper(HttpServletResponse response){
  13. //必须调用父类构造方法
  14. super(response);
  15. }
  16. public PrintWriter getWriter() throws IOException{
  17. //返回字符数组Writer,缓存内容
  18. return new PrintWriter(charWriter);
  19. }
  20. public CharArrayWriter getCharWriter(){
  21. return charWriter;
  22. }
  23.  
  24. }

过滤器:

  1. package filter;
  2.  
  3. import java.io.FileNotFoundException;
  4. import java.io.IOException;
  5. import java.io.PrintWriter;
  6. import java.util.Properties;
  7.  
  8. import javax.servlet.Filter;
  9. import javax.servlet.FilterChain;
  10. import javax.servlet.FilterConfig;
  11. import javax.servlet.ServletException;
  12. import javax.servlet.ServletRequest;
  13. import javax.servlet.ServletResponse;
  14. import javax.servlet.http.HttpServletResponse;
  15.  
  16. public class ReplaceFilter implements Filter {
  17. private Properties propert = new Properties();
  18.  
  19. public void init(FilterConfig filterConfig) throws ServletException {
  20. System.out.println("ReplaceFilter init.....");
  21.  
  22. // 通过filterConfig获得初始胡文件名
  23. String filePath = filterConfig.getInitParameter("filePath");
  24. try {
  25. // 导入资源文件
  26. propert.load(ReplaceFilter.class.getClassLoader()
  27. .getResourceAsStream(filePath));
  28.  
  29. } catch (FileNotFoundException e) {
  30. e.printStackTrace();
  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35.  
  36. public void doFilter(ServletRequest request, ServletResponse response,
  37. FilterChain chain) throws IOException, ServletException {
  38. HttpServletResponse res = (HttpServletResponse) response;
  39. // 实例化响应器包装类
  40. ResponseReplaeWrapper resp = new ResponseReplaeWrapper(res);
  41. chain.doFilter(request, resp);
  42. // 缓存输出字符
  43. String outString = resp.getCharWriter().toString();
  44. // 循环替换不合法的字符
  45. for (Object o : propert.keySet()) {
  46. String key = (String) o;
  47. outString = outString.replace(key, propert.getProperty(key));
  48. }
  49. // 利用原先的HttpServletResponse输出字符
  50. PrintWriter out = res.getWriter();
  51. out.write(outString);
  52. }
  53.  
  54. public void destroy() {
  55. System.out.println("ReplaceFilter destroy......");
  56. }
  57.  
  58. }

在web.xml中配置过滤器

  1. <filter>
  2. <filter-name>ReplaceFilter</filter-name>
  3. <filter-class>filter.ReplaceFilter</filter-class>
  4. <init-param>
  5. <param-name>filePath</param-name>
  6. <param-value>/replace_ZH.properties</param-value>
  7. </init-param>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>ReplaceFilter</filter-name>
  11. <url-pattern>*.do</url-pattern>
  12. </filter-mapping>

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

建个测试的servlet

  1. package servlet;
  2.  
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  5.  
  6. import javax.servlet.ServletException;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10.  
  11. public class ResponseServlet extends HttpServlet {
  12. public ResponseServlet() {
  13. super();
  14. }
  15.  
  16. public void destroy() {
  17. super.destroy(); // Just puts "destroy" string in log
  18. // Put your code here
  19. }
  20.  
  21. public void doGet(HttpServletRequest request, HttpServletResponse response)
  22. throws ServletException, IOException {
  23.  
  24. response.setContentType("text/html");
  25. PrintWriter out = response.getWriter();
  26. out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
  27. out.println("<HTML>");
  28. out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
  29. out.println(" <BODY>");
  30. out.println("思思博士<br/>色情<br/>赌博<br/>dfdffddf");
  31. /*out.print(" This is ");
  32. out.print(this.getClass());
  33. out.println(", using the GET method");*/
  34. out.println(" </BODY>");
  35. out.println("</HTML>");
  36. out.flush();
  37. out.close();
  38. }
  39.  
  40. public void doPost(HttpServletRequest request, HttpServletResponse response)
  41. throws ServletException, IOException {
  42.  
  43. response.setContentType("text/html");
  44. PrintWriter out = response.getWriter();
  45. out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
  46. out.println("<HTML>");
  47. out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
  48. out.println(" <BODY>");
  49. out.print(" This is ");
  50. out.print(this.getClass());
  51. out.println(", using the POST method");
  52. out.println(" </BODY>");
  53. out.println("</HTML>");
  54. out.flush();
  55. out.close();
  56. }
  57.  
  58. public void init() throws ServletException {
  59. }
  60.  
  61. }

java利用过滤器实现编码的转换,内容输出的替换的更多相关文章

  1. 理清Java中的编码解码转换

    1.字符集及编码方式 概括:字符编码方式及大端小端 详细:彻底理解字符编码 可以通过Charset.availableCharsets()获取Java支持的字符集,以JDK8为例,得到其支持的字符集: ...

  2. 利用JAXB实现java实体类和xml互相转换

    1.应用场景 在使用WebService实现数据上传下载,数据查询时,可以利用JAXB实现java实体类和xml互相转换 2.Demo 2.1 student.java 实体类,包含list(set同 ...

  3. 利用Java位运算符,完成Unsigned转换(无符号)

    方案二:利用Java位运算符,完成Unsigned转换. 正常情况下,Java提供的数据类型是有符号signed类型的,可以通过位运算的方式得到它们相对应的无符号值,参见几个方法中的代码: publi ...

  4. 【Java基础专题】编码与乱码(05)---GBK与UTF-8之间的转换

    原文出自:http://www.blogjava.net/pengpenglin/archive/2010/02/22/313669.html 在很多论坛.网上经常有网友问" 为什么我使用 ...

  5. java 利用spring JavaMailSenderImpl发送邮件,支持普通文本、附件、html、velocity模板

    java 利用spring JavaMailSenderImpl发送邮件,支持普通文本.附件.html.velocity模板 博客分类: Java Spring   本文主要介绍利用JavaMailS ...

  6. 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  7. java中的字符编码方式

    1. 问题由来 面试的时候被问到了各种编码方式的区别,结果一脸懵逼,这个地方集中学习一下. 2. 几种字符编码的方式 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符 ...

  8. Java web中常见编码乱码问题(二)

    根据上篇记录Java web中常见编码乱码问题(一), 接着记录乱码案例: 案例分析:   2.输出流写入内容或者输入流读取内容时乱码(内容中有中文) 原因分析: a. 如果是按字节写入或读取时乱码, ...

  9. 深入分析Java Web中的编码问题

    编码问题一直困扰着我,每次遇到乱码或者编码问题,网上一查,问题解决了,但是实际的原理并没有搞懂,每次遇到,都是什么头疼. 决定彻彻底底的一次性解决编码问题. 1.为什么要编码 计算机的基本单元是字节, ...

随机推荐

  1. dwr使用步骤

    DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码使用运行在 ...

  2. linux xargs参数

    xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从 ...

  3. C语言常用的小代码

    圆周率Pi tan(Pi/4)=1 => Pi=4*arctan(1) 反正切函数arctan()在C语言里表示为atan(),为保证精度取圆周率的代码如下: const double Pi = ...

  4. Android 抽屉类SlidingDrawer的使用

     比较简单,设置好SlidingDrawer控件的handle和content属性就可以了.  android:content="@+id/content"  android:ha ...

  5. 【转】如何使用PhoneGap打包Web App

    如何使用PhoneGap打包Web App 最近做了一款小游戏,定位是移动端访问,思来想去最后选择了jQuery mobile最为框架,制作差不多以后,是否可以打包成App,恰好以前对PhoneGap ...

  6. 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 ...

  7. c++的历史-异常

    1.异常出现的目的 在c++语言的设计和演化中,Bjarne Stroustrup说过异常的设计假定如下情况: 基本上是为了处理错误 与函数定义相比,异常处理是很少的 与函数调用相比,异常出现的频率较 ...

  8. python 深入理解 赋值、引用、拷贝、作用域

    在 python 中赋值语句总是建立对象的引用值,而不是复制对象.因此,python 变量更像是指针,而不是数据存储区域, 这点和大多数 OO 语言类似吧,比如 C++.java 等 ~ 1.先来看个 ...

  9. SVN在团队项目中的使用技巧:[2]Tag操作

    SVN是Subversion的简称,是一个开放源代码的版本控制系统 本节讲述SVN使用中的TAG操作 文中若有错误或不足之处,欢迎留言指正   工具/原料 电脑 SVN 方法/步骤 1.认识SVN中T ...

  10. 如何缩短SQL Server 的启动时间

    将/nosplash添加到SQLServer Manageement Studio的快捷方式可以缩短启动时间.为此,右击SSMS快捷方式(位于你的桌面上.start菜单中或任务栏中)并选择Proper ...