zoukankan      html  css  js  c++  java
  • Filter编码过滤

          为了在后台统一设定编码,不必在每个servlet中单独设定编码,从而避免重复的劳作,又增加代码的可读性和可维护性的目的,使用Filter是一个很不错的选择。

    1. EncodingFilter类

     1 public class EncodingFilter implements Filter{
     2     
     3     //设定默认编码
     4     private String charset = "UTF-8";
     5     private FilterConfig config;
     6     
     7     @Override
     8     public void destroy() {
     9         charset = null;
    10         config = null;
    11     }
    12 
    13     @Override
    14     public void doFilter(ServletRequest request, ServletResponse response,
    15             FilterChain chain) throws IOException, ServletException {
    16         //设置请求响应字符编码
    17         HttpServletRequest req = (HttpServletRequest)request;
    18         HttpServletResponse res = (HttpServletResponse)response;
    19         req.setCharacterEncoding(charset);
    20         res.setContentType("text/html;charset=utf-8");
    21         //对get请求编码统一处理
    22         if(req.getMethod().equalsIgnoreCase("GET")){
    23             //通过调用自己写的EncodingWrapper类,对request进行包装
    24             EncodingWrapper wrapper = new EncodingWrapper(req,charset);
    25             chain.doFilter(wrapper, res);
    26         }else{
    27             chain.doFilter(req, res);
    28         }
    29     }
    30 
    31     @Override
    32     public void init(FilterConfig config) throws ServletException {
    33         this.config = config;
    34         //从web.xml配置中读取设定的编码方式
    35         String charset = config.getServletContext().getInitParameter("charset");
    36         if(StringUtils.isNotEmpty(charset)){
    37             this.charset = charset;
    38         }
    39     }
    40     
    41 }
    View Code

    2. EncodingWrapper类

     1 public class EncodingWrapper extends HttpServletRequestWrapper{
     2     
     3     private String charset = "UTF-8";
     4     
     5     /**
     6      * 创建一个新的实例 EncodingWrapper.
     7      * @param request
     8      */
     9     public EncodingWrapper(HttpServletRequest request) {
    10         super(request);
    11     }
    12     
    13     /**
    14      * 获取被装饰对象的引用和采用的字符编码
    15      * @param request
    16      * @param charset
    17      */
    18     public EncodingWrapper(HttpServletRequest request, String charset){
    19         super(request);
    20         this.charset = charset;
    21     }
    22     
    23     @Override
    24     public String getParameter(String name){
    25         String value = super.getParameter(name);
    26         if(StringUtils.isEmpty(value))return null;
    27         try {
    28             value = new String(value.getBytes("ISO-8859-1"),charset);
    29             return value;
    30         } catch (UnsupportedEncodingException e) {
    31             e.printStackTrace();
    32         }
    33         return value;
    34     }
    35 
    36 }
    View Code

    3. jsp页面

     1 <%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     2 <!DOCTYPE HTML>
     3 <html>
     4 <head>
     5     <title>servlet测试</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     <style type="text/css">
    12       *{margin:0;padding:0}
    13       body{font-size:12px;font-family:"微软雅黑";color:#333;}
    14       .wrap{width:640px;border:1px solid #333;}
    15       input[type="text"]{width:300px;height:30px;margin:10px;outline:none;padding-left:10px;}
    16       .wrap label{width:60px;display:inline-block;text-align:right}
    17     </style>
    18 </head>
    19 <body>
    20 <div class="wrap">
    21    <form action="../ServletTest" method="get" >
    22        <label> 用户名:</label><input type="text" name="username" /><br />
    23        <label> 密码:</label><input type="text" name="password" />
    24        <input type="submit" />
    25    </form>
    26 </div>
    27 </body>
    28 </html>
    View Code

    4. servletTest类

     1 //这种注解的方式不需要再web.xml中配置
     2 //@WebServlet(name = "MyFirstServlet", urlPatterns = {"/ServletTeaa"})
     3 public class ServletTest extends HttpServlet{
     4 
     5     private static final long serialVersionUID = 1L;
     6 
     7     @Override
     8     protected void doGet(HttpServletRequest req, HttpServletResponse resp)
     9             throws ServletException, IOException {
    10         doPost(req,resp);
    11     }
    12 
    13     @Override
    14     protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    15             throws ServletException, IOException {
    16         //有了统一的编码过滤器,以下两行代码可以“隐身”了
    17         //req.setCharacterEncoding("utf-8");
    18         //resp.setCharacterEncoding("utf-8");
    19         System.out.println("进入了ServletTest");
    20         String username = req.getParameter("username");
    21         String password = req.getParameter("password");
    22         System.out.println("用户名:"+username+",密码: "+password);
    23         //resp.setContentType("text/html;charset=utf-8");
    24         PrintWriter    out = resp.getWriter();
    25         out.println("<html>");
    26         out.println("<head>");
    27         out.println("<title>Servlet编码测试</title>");
    28         out.println("</head>");
    29         out.println("<body>");
    30         out.println("<h2>Servlet编码测试" + req.getContextPath() + "</h2>");
    31         out.println("</body>");
    32         out.println("</html>");
    33         System.out.println("退出了ServletTest");
    34     }
    35 
    36     @Override
    37     public void service(ServletRequest req, ServletResponse res)
    38             throws ServletException, IOException {
    39         super.service(req, res);
    40     }
    41 
    42 }

    最后,在web.xml中作好配置

      <context-param>
          <param-name>charset</param-name>
          <param-value>UTF-8</param-value>
      </context-param>
    
      <!-- 过滤器配置 -->
      <filter>
          <description>统一编码过滤器</description>
          <filter-name>encodingFilter</filter-name>
          <filter-class>com.ue.filter.EncodingFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>encodingFilter</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>
      
      <!-- servlet配置 -->
      <servlet>
          <description>servlet测试</description>
          <servlet-name>MyFirstServlet</servlet-name>
          <servlet-class>com.ue.servlet.ServletTest</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>MyFirstServlet</servlet-name>
          <url-pattern>/ServletTest</url-pattern>
      </servlet-mapping>

    当然,你也可以直接在server.xml直接设置你的编码方式。

  • 相关阅读:
    SpringBoot整合Swagger2
    AuthenticationToken的元素不满足实际情况,登录的时候需要有学校id或者其他参数
    nginx导入学成静态网页
    springboot使用枚举类型
    springboot配置多个yml文件
    尝试使用freemarker模板引擎生成打印文件
    多版本并发控制 MVCC 实现可重复读
    多版本并发控制 MVCC简介
    模拟3级分类信息查询
    IDEA去掉屏幕中间的白色竖线
  • 原文地址:https://www.cnblogs.com/dzyBlog/p/5287376.html
Copyright © 2011-2022 走看看