过滤器_编码统一处理

来源:互联网 发布:阿里云域名空间备案 编辑:程序博客网 时间:2024/06/05 09:23

问题:

       几乎每一个Servlet都要涉及编码处理:处理请求数据中文问题!
     【GET/POST】
       每个servlet都要做这些操作,把公用的代码抽取-过滤器实现!

问题原因:

   出现get中文乱码,是因为在request.getParameter("参数名")方法内部没有进行提交方式判断并处理。

解决方案:

    1.对指定接口的某一个方法进行功能扩展,可以使用代理:对request对象(目标对象),创建代理对象
    2.对 HttpServletRequestWrapper类中的getParameter方法进行重写 

代码实现思路:

1.index.jsp  登陆,输入“中文”
2.LoginServlet.java   直接处理登陆请求
3.EncodingFilter.java   过滤器处理请求数据编码:GET/POST

代码实现:

编码处理的过滤器一:

  1. package com.cn.filter;
  2. import java.io.IOException;
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Method;
  5. import java.lang.reflect.Proxy;
  6. import javax.servlet.Filter;
  7. import javax.servlet.FilterChain;
  8. import javax.servlet.FilterConfig;
  9. import javax.servlet.ServletException;
  10. import javax.servlet.ServletRequest;
  11. import javax.servlet.ServletResponse;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletResponse;
  14. /**
  15. * 编码处理过滤器
  16. * @author liuzhiyong
  17. *
  18. */
  19. public class EncodingFilter implements Filter{
  20. /**
  21. * 过滤器业务处理方法:处理公用的业务逻辑操作
  22. */
  23. @Override
  24. public void doFilter(ServletRequest req, ServletResponse res,
  25. FilterChain chain) throws IOException, ServletException {
  26. //转型
  27. final HttpServletRequest request = (HttpServletRequest)req;
  28. HttpServletResponse response = (HttpServletResponse)res;
  29. /**
  30. * 1.处理公用的逻辑业务
  31. */
  32. //设置post方式提交的请求的编码
  33. request.setCharacterEncoding("utf-8");//只对POST提交有效
  34. //设置页面打开时的编码格式,设置响应体的编码格式
  35. response.setContentType("text/html;charset=utf-8");
  36. /**
  37. * 出现get中文乱码,是因为在request.getParameter("参数名")方法内部没有进行提交方式判断并处理
  38. *
  39. * 解决:对指定接口的某一个方法进行功能扩展,可以使用代理:
  40. * 对request对象(目标对象),创建代理对象
  41. */
  42. HttpServletRequest requestProxy =(HttpServletRequest)Proxy.newProxyInstance(
  43. request.getClass().getClassLoader(),// 定义代理对象类的类加载器。负责加载类的对象
  44. new Class[]{HttpServletRequest.class}, //代理类要实现的接口列表
  45. new InvocationHandler(){//// 当调用目标对象对象方法的时候, 自动触发事务处理器
  46. @Override
  47. public Object invoke(Object proxy, Method method, Object[] args)//这里的args是调用方法传入的参数
  48. throws Throwable {
  49. //定义方法返回值
  50. Object returnValue = null;
  51. //当前执行方法的方法名
  52. String methodName = method.getName();
  53. //判断:对getParameter方法进行GET方式提交中文处理
  54. if("getParameter".equals(methodName)){
  55. //获取请求数据的值
  56. String parameterValue = request.getParameter(args[0].toString());//调用目标对象的方法
  57. //获取提交请求的提交方式
  58. String submitMethod = request.getMethod();
  59. //判断,如果是GET提交,需要对数据进行处理(POST提交已经处理过了)
  60. if("GET".equals(submitMethod)){//注意在Servlet中这里是大写的GET
  61. if(parameterValue!=null && !"".equals(parameterValue.trim())){
  62. //处理GET方式提交的中文
  63. parameterValue = new String(parameterValue.getBytes("ISO-8859-1"), "UTF-8");
  64. }
  65. }
  66. return parameterValue;//返回getParameter方法的返回值
  67. }else{
  68. returnValue = method.invoke(request, args);//调用目标对象request的其它方法
  69. return returnValue;//返回返回值
  70. }
  71. }
  72. });
  73. //2.放行(进入下一个过滤器或者进入Servlet)
  74. chain.doFilter(requestProxy, response);//传入request代理对象requestProxy
  75. }
  76. @Override
  77. public void init(FilterConfig filterConfig) throws ServletException {
  78. // TODO Auto-generated method stub
  79. }
  80. @Override
  81. public void destroy() {
  82. // TODO Auto-generated method stub
  83. }
  84. }

编码处理的过滤器二:

  1. package com.cn.filter;
  2. import java.io.IOException;
  3. import java.io.UnsupportedEncodingException;
  4. import javax.servlet.Filter;
  5. import javax.servlet.FilterChain;
  6. import javax.servlet.FilterConfig;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.ServletRequest;
  9. import javax.servlet.ServletResponse;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletRequestWrapper;
  12. import javax.servlet.http.HttpServletResponse;
  13. public class EncodingFilter implements Filter{
  14. //保存filterConfig
  15. private FilterConfig filterConfig;
  16. public void init(FilterConfig filterConfig) throws ServletException {
  17. this.filterConfig = filterConfig;
  18. }
  19. public void doFilter(ServletRequest req, ServletResponse res,
  20. FilterChain chain) throws IOException, ServletException {
  21. //类型转换
  22. HttpServletRequest request = (HttpServletRequest)req;
  23. HttpServletResponse response = (HttpServletResponse)res;
  24. //得到配置文件中的编码格式:
  25. String encoding = filterConfig.getInitParameter("encoding");
  26. if(encoding == null){
  27. encoding = "utf-8";
  28. }
  29. //对POST方式提交的请求进行编码
  30. request.setCharacterEncoding(encoding);
  31. //设置页面打开时的响应体的编码格式
  32. response.setContentType("text/html;charset="+encoding);
  33. MyHttpServletRequest mRequest = new MyHttpServletRequest(request);
  34. //如果是GET请求方式
  35. chain.doFilter(mRequest, response);//放行
  36. }
  37. public void destroy() {
  38. }
  39. }
  40. class MyHttpServletRequest extends HttpServletRequestWrapper{
  41. public MyHttpServletRequest(HttpServletRequest request) {
  42. super(request);
  43. }
  44. @Override
  45. public String getParameter(String name) {
  46. //拿到原来的值
  47. String parameterValue = super.getParameter(name);
  48. //如果传入的值为空
  49. if(parameterValue == null){
  50. return null;
  51. }
  52. //判断请求方式
  53. String method = super.getMethod();
  54. if("get".equalsIgnoreCase(method)){//如果是get方式提交的请求
  55. try {
  56. parameterValue = new String(parameterValue.getBytes("iso-8859-1"), super.getCharacterEncoding());
  57. } catch (UnsupportedEncodingException e) {
  58. e.printStackTrace();
  59. }
  60. }
  61. return parameterValue;
  62. }
  63. }
登录的Servlet
  1. package com.cn.servlet;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. public class LoginServlet extends HttpServlet {
  8. public void doGet(HttpServletRequest request, HttpServletResponse response)
  9. throws ServletException, IOException {
  10. this.doPost(request, response);
  11. }
  12. public void doPost(HttpServletRequest request, HttpServletResponse response)
  13. throws ServletException, IOException {
  14. //获取参数
  15. String userName = request.getParameter("userName");
  16. System.out.println(request.getMethod() + "方式提交的用户名:" + userName);
  17. }
  18. }

web.xml中过滤器配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="3.0"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  7. <!-- 编码处理过滤器配置 -->
  8. <filter>
  9. <filter-name>encodingFilter</filter-name>
  10. <filter-class>com.cn.filter.EncodingFilter</filter-class>
  11. </filter>
  12. <filter-mapping>
  13. <filter-name>encodingFilter</filter-name>
  14. <url-pattern>/*</url-pattern>
  15. </filter-mapping>
  16. <servlet>
  17. <servlet-name>LoginServlet</servlet-name>
  18. <servlet-class>com.cn.servlet.LoginServlet</servlet-class>
  19. </servlet>
  20. <servlet-mapping>
  21. <servlet-name>LoginServlet</servlet-name>
  22. <url-pattern>/login</url-pattern>
  23. </servlet-mapping>
  24. <welcome-file-list>
  25. <welcome-file>index.jsp</welcome-file>
  26. </welcome-file-list>
  27. </web-app>

输入页面

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  3. <html>
  4. <head>
  5. <title>My JSP 'index.jsp' starting page</title>
  6. <meta http-equiv="pragma" content="no-cache">
  7. <meta http-equiv="cache-control" content="no-cache">
  8. <meta http-equiv="expires" content="0">
  9. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  10. <meta http-equiv="description" content="This is my page">
  11. <!--
  12. <link rel="stylesheet" type="text/css" href="styles.css">
  13. -->
  14. </head>
  15. <body>
  16. <form name="formLogin1" action="${pageContext.request.contextPath }/login" method="post">
  17. 用户名:<input type="text" name="userName"/><br/>
  18. <input type="submit" value="POST提交"/>
  19. </form>
  20. <form name="formLogin2" action="${pageContext.request.contextPath }/login" method="get">
  21. 用户名:<input type="text" name="userName"/><br/>
  22. <input type="submit" value="GET提交"/>
  23. </form>
  24. </body>
  25. </html>
测试效果:
①当代码中不进行任何的编码处理时:中文乱码

 ②当设置post方式提交的请求的编码时,只对POST提交有效:GET提交方式中文乱码

 ③当使用过滤器进行编码处理时:中文正常

 
0 0