动态代理实现设置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()

然后强转即可。

原文地址:https://www.cnblogs.com/evilliu/p/8728639.html

时间: 2024-10-13 10:25:56

动态代理实现设置tomcat请求编码的相关文章

AndroidInject项目使用动态代理增加对网络请求的支持

详细代码: http://www.cnblogs.com/tiantianbyconan/p/3540427.html AndroidInject项目是我写的一个使用注解注入来简化代码的开源项目 https://github.com/wangjiegulu/androidInject 今天新增功能如下: 1. 增加@AIScreenSize注解,作用于属性,用于注入当前设备的屏幕大小(宽高) 2. 增加对网络请求的支持,使用动态代理实现:@AIGet注解,作用于接口方法,表示以GET来请求url

二十二 动态代理&amp;解决网站的字符集编码问题

设计模式: 软件开发过程中,遇到相似问题,将问题的解决方式抽取模型(套路) 单例,工厂,装饰者,适配器,动态代理 谷歌汽车场景: 谷歌汽车场景Car 设计了汽车开发阅读 Interface Icar{  start  run  stop} final class GoogleCar implments ICar(){} 希望将谷歌Car接入到生态圈 装饰者设计模式 场景:二次开发的时候,无法获取源码GoogleCar,无法使用继承的情况下,要对已经存在的对象进行增强 前提:可以获取到被装饰的对象

动态代理在WEB与JDBC开发中的应用

WEB案例 目前有一个2005年开始,基于Struts1的Web项目A,其验证部分依赖于主站的SSO(单点登录).在请求站点A的时候,用户会被强制带去做SSO验证,通过身份验证后后,主站会自动地把请求转发至A站点,并在request header中添加了用于保存登录用户ID的新属性SM_USER,然后A站点根据用户ID提供相应的服务.由于该项目是一个既存项目,所以其中残余大量像下面一样的测试代码. [java] view plain copy String user_id = request.g

快速学会Spring动态代理原理

本文主要是讲述快速学会Spring动态代理原理,更多Java技术知识,请登陆疯狂软件教育官网. 一.为什么要使用动态代理 当一个对象或多个对象实现了N中方法的时候,由于业务需求需要把这个对象和多个对象的N个方法加入一个共同的方法,比如把所有对象的所有方法加入事务这个时候有三种方法: 方法一:一个一个对象一个一个方法去加,很显然这个方法是一个比较笨的方法. 方法二:加一个静态代理对象将这个静态代理对象实现要加事务对象的接口.然后在静态代理对象里面每个方法里面加上事务. 方法三:使用动态代理对象,进

动态代理在WEB与JDBC开发中的应用(JDBC篇)

背景描述 如果之前看过<动态代理在WEB与JDBC开发中的应用(WEB篇)>,这篇的内容可以全当是另一种应用的进阶举例,而在实现上确实没有太多进步的地方.我们先看一下项目所面临问题以及期望解决方案.在作者所接触的这个项目中,直接使用原始JDBC技术,java.sql.PreparedStatement和java.sql.ResultSet几乎占领了数据访问层,没有半点OR Mapping的迹象,看起来是不是很悲催?命啊-在项目开发至一半的时候,突然发现要对日文字符进行支持,而在之前一直使用英文

全站请求编码过滤器

1 *自定义的: 2 >代码: 3 public class EncodingFilter implements Filter{ 4 private String charset="utf-8"; 5 public void destroy(){ 6 } 7 public void doFilter(ServletRequest req,ServletResponse resp, 8 FilterChain chain){ 9 HttpServletRequest request

菜鸟学习Spring——60s让你学会动态代理

一.为什么要使用动态代理 当一个对象或多个对象实现了N中方法的时候,由于业务需求需要把这个对象和多个对象的N个方法加入一个共同的方法,比如把所有对象的所有方法加入事务这个时候有三种方法: 方法一:一个一个对象一个一个方法去加,很显然这个方法是一个比较笨的方法. 方法二:加一个静态代理对象将这个静态代理对象实现要加事务对象的接口.然后在静态代理对象里面每个方法里面加上事务. 方法三:使用动态代理对象,进行动态的加载事务. 使用动态代理是为了让对象实现了开闭原则,对扩展开放,而对修改关闭.Sprin

细说java系统之动态代理

代理模式 在深入学习动态代理之前,需要先掌握代理模式.只有深刻理解了代理模式的应用,才能充分理解Java动态代理带来的便利. 在生活中存在许多使用"代理模式"的场景,比如:村里的张三今年已经30岁了,但是还没结婚,可把他老妈给愁坏了,于是就拜托村东头的王媒婆给儿子找个媳妇. 在这里,要娶媳妇的人是张三,但是他不能直接跑到女方家把人家闺女直接带回来,需要中间人王媒婆上门说媒,在这里王媒婆就是一个代理. 另外,我们上大学的时候都知道,学校的机房都是通过一个代理服务器上网的,因为只有一个外网

设置Tomcat的UTF-8编码

利用request.setCharacterEncoding("UTF-8");来设置Tomcat接收请求的编码格式,只对POST方式提交的数据有效,对GET方式提交的数据无效! 要设置GET的编码,可以修改server.xml文件中,相应的端口的Connector的属性:URIEncoding="UTF-8",这样,GET方式提交的数据才会被正确解码. <Connector port="8080" protocol="HTTP/