Servlet Filter如何改变请求参数?

Times2001 2009-06-22 09:53:53
页面上有个文本输入框,比如username
我想写一个filter,然后在filter中把username的值改变了。
比如用户输入的username是Jack,我想在filter中把Jack改成Tom
有谁知道怎么改?

request.setAttribute(),不行,改的不是paramter
request.getParameterMap().put(),也不行,这个map被lock了

有办法改吗?
...全文
716 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
robyjeffding 2009-06-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gordonkkk 的回复:]
不是要改变parameter的值。只是改变一下getParameter方法的行为而已。
我假设你只改username,只把Jack改成Tom,例子如下
这是包装器类

Java code
public class MyRequestWarpper extends HttpServletRequestWrapper {

private HttpServletRequest request;

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

@O…
[/Quote]
LS正解
gordonkkk 2009-06-22
  • 打赏
  • 举报
回复
不是要改变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);
bingsha1976 2009-06-22
  • 打赏
  • 举报
回复
页面
<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);

action

System.out.println(request.getAttribute("uname"));----------------输出 lisi
Times2001 2009-06-22
  • 打赏
  • 举报
回复
To lvfeng19806001:
你的办法不可行,谢谢你!

To gordonkkk:
继承HttpServletRequestWrapper?继承之后如何改变一个parameter的值?如果你的方法可行,能给个例子吗?
javagxc 2009-06-22
  • 打赏
  • 举报
回复
是改成人意值,还是给成确定的一个值啊,这个值是在页面之间传递,还是存入数据库?
如果在页面之间传递,用1楼的方法,如果是存入数据库,可以在存入数据库之前给它赋值。
sangshusen_1988 2009-06-22
  • 打赏
  • 举报
回复
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");
}
shuai45 2009-06-22
  • 打赏
  • 举报
回复
可以。写个过滤器,只针对(如AA.do)进行过滤,当有AA.do请求时 file就过拦截,然后取得其name值进行修改。
修改完毕后 再重新转向AA.do操作。
不过要注意 在重新转向的时候要加个参数识别,否则就会一直在过滤器中循环操作了。
gordonkkk 2009-06-22
  • 打赏
  • 举报
回复
这事情分两步
第一是你要以什么样的策略改变请求参数,比如要改变哪些参数的值,改变成一个死值还是生成的,还是传进来的值
第二是怎么实现这样的改变

如果你的改变很简单,就不必拘泥于一定要改request了吧,用的时候判断一下不就行了吗?
如果一定要改,可以用HttpServletRequestWrapper,在过滤器里把容器生成的request包装一下。在包装类的getParameter方法中实现你的改变策略。
lvfeng19806001 2009-06-22
  • 打赏
  • 举报
回复
直接在过滤器中重定向或请求转发到目的地,url重写,即URL后面加?username=Tom行吗?猜的!

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧