• 动态代理实现设置tomcat请求编码


    1)htmlcode:

    <html>
      <head>
        <title>$Title$</title>
      </head>
      <body>
      <form action="/login"  method="post" >
        姓名:<input  type="text" name="username"><br>
        备注:<textarea></textarea>
    
        <input type="submit"><br>
    
      </form>
      </body>
    </html>

     2)servlet code

     1 package jd.com.coding;
     2 
     3 import javax.servlet.ServletException;
     4 import javax.servlet.annotation.WebServlet;
     5 import javax.servlet.http.HttpServlet;
     6 import javax.servlet.http.HttpServletRequest;
     7 import javax.servlet.http.HttpServletResponse;
     8 import java.io.IOException;
     9 
    10 @WebServlet(name = "Servletlogin" ,urlPatterns ="/login")
    11 public class Servletlogin extends HttpServlet {
    12     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    13         String username=request.getParameter("username");
    14         System.out.println(username);
    15 
    16 
    17 
    18     }
    19 
    20     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    21 
    22     }
    23 }

    3)filter代码:

     1 package jd.com.coding;
     2 
     3 import javax.servlet.*;
     4 import javax.servlet.annotation.WebFilter;
     5 import javax.servlet.http.HttpServletRequest;
     6 import javax.servlet.http.HttpServletResponse;
     7 import java.io.IOException;
     8 import java.lang.reflect.InvocationHandler;
     9 import java.lang.reflect.Method;
    10 import java.lang.reflect.Proxy;
    11 
    12 @WebFilter(filterName = "FilterCoding",urlPatterns = "/login")
    13 public class FilterCoding implements Filter {
    14     public void destroy() {
    15     }
    16 
    17     public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
    18         //增强
    19         HttpServletResponse response= (HttpServletResponse) resp;
    20         HttpServletRequest request= (HttpServletRequest) req;
    21 
    22         HttpServletRequest reqproxy =(HttpServletRequest) Proxy.newProxyInstance(HttpServletRequest.class.getClassLoader(), (Class<?>[]) request.getClass().getGenericInterfaces(), new InvocationHandler() {
    23             @Override
    24             public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    25                 if(method.getName().equalsIgnoreCase("getParameter")){
    26                     if(request.getMethod().equalsIgnoreCase("get")){
    27 //                        String[get] ar=(String[]) args;
    28 //                        String str=request.getParameter(ar[0]);
    29                         String str= (String) method.invoke(request,args);
    30                         return  new String(str.getBytes("iso8859-1"),"utf-8");
    31                     }else if(request.getMethod().equalsIgnoreCase("post")){
    32                         request.setCharacterEncoding("utf-8");
    33                         return  method.invoke(request,args);
    34                     }
    35                 }
    36 
    37                 return method.invoke(request,args);
    38             }
    39         });
    40         chain.doFilter(reqproxy, resp);
    41     }
    42 
    43     public void init(FilterConfig config) throws ServletException {
    44 
    45     }
    46 
    47 }

    其中获取类的接口集合使用Class类的方法:getClassLoader()

    public Type[] getGenericInterfaces()

    然后强转即可。

  • 相关阅读:
    html5 中的 css样式单 的 两种调用方式的区别
    互联网公司的相关人员及业务简介
    require.js 入门学习-备
    IOS修改webView背景透明以及IOS调用前台js的方法
    Javascript AMD模块化规范-备用
    Meta 的两个 相关属性
    <meta http-equiv="pragma" content="no-cache"/>
    css:中文词不断开,整体换行
    linux驱动开发---导出内核符号
    web html 防盗链
  • 原文地址:https://www.cnblogs.com/evilliu/p/8728639.html
Copyright © 2020-2023  润新知