页面上有个文本输入框,比如username
我想写一个filter,然后在filter中把username的值改变了。
比如用户输入的username是Jack,我想在filter中把Jack改成Tom
有谁知道怎么改?request.setAttribute(),不行,改的不是paramter
request.getParameterMap().put(),也不行,这个map被lock了有办法改吗?

解决方案 »

  1.   

    直接在过滤器中重定向或请求转发到目的地,url重写,即URL后面加?username=Tom行吗?猜的!
      

  2.   

    这事情分两步
    第一是你要以什么样的策略改变请求参数,比如要改变哪些参数的值,改变成一个死值还是生成的,还是传进来的值
    第二是怎么实现这样的改变如果你的改变很简单,就不必拘泥于一定要改request了吧,用的时候判断一下不就行了吗?
    如果一定要改,可以用HttpServletRequestWrapper,在过滤器里把容器生成的request包装一下。在包装类的getParameter方法中实现你的改变策略。
      

  3.   

    可以。写个过滤器,只针对(如AA.do)进行过滤,当有AA.do请求时 file就过拦截,然后取得其name值进行修改。
    修改完毕后 再重新转向AA.do操作。
    不过要注意 在重新转向的时候要加个参数识别,否则就会一直在过滤器中循环操作了。
      

  4.   

    2楼说的很对,
    写一个你自己的httpServletRequest,继承自HttpServletRequestWrapper,假如这个类叫MyHttpServletRequest,
    MyHttpServletRequest,重写getParameter方法,HttpServletRequestWrapper实例化的时候必须传递一个
    HttpServletRequest对象,把你原来的request对象传进去,往下传递的是你的包装过后的request,
    chain.doFilter(myHttpServletRequest, response);private HttpServletRequest request;// 原生的request对象
    // 伪代码
    public String getParameter(String name){
        String value = request.getParameter(name);
        // 返回过滤后的数据
        return value.replace("jacky","tom");
    }
      

  5.   

    To lvfeng19806001:
    你的办法不可行,谢谢你!To gordonkkk:
    继承HttpServletRequestWrapper?继承之后如何改变一个parameter的值?如果你的方法可行,能给个例子吗?
      

  6.   

    页面
     <html:form action="user.do">
       <input type="text"  name="uname" >-----------------输入zhangsan
       <html:submit value="submit"></html:submit>
       </html:form>过滤器
    request.setAttribute("uname", "lisi");
    filterChain.doFilter(request, response);actionSystem.out.println(request.getAttribute("uname"));----------------输出 lisi
      

  7.   

    不是要改变parameter的值。只是改变一下getParameter方法的行为而已。
    我假设你只改username,只把Jack改成Tom,例子如下
    这是包装器类public class MyRequestWarpper extends HttpServletRequestWrapper { private HttpServletRequest request;

    public MyRequestWarpper(HttpServletRequest request) {
    super(request);
    this.request = request;
    }

    @Override
    public String getParameter(String parameter) {
    if ("username".equals(parameter) && request.getParameter(parameter).equals("Jack")) {
    return "Tom";
    }
    return request.getParameter(parameter);
    }
    }过滤器中,调用这个包装器request = new MyRequestWarpper(request);
    filterChain.doFilter(request, response);