1. 程式人生 > >動態代理實現設置tomcat請求編碼

動態代理實現設置tomcat請求編碼

cati character except getc ignorecas ase method span bmi

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()

然後強轉即可。

動態代理實現設置tomcat請求編碼