前言:
在做filter过滤的时候,想把request收集到的表单数据,其中key为"uname"的非法文字 'md' 转换成"**"这个字符串,于是在判断key为"uname"之后,用**来覆盖它的value值,结果发生了问题!
if("md".equals(text[0])){
httpServletRequest.setAttribute("uname","**");
System.out.println(httpServletRequest.getAttribute("uname"));
}
问题:
在跳转到结果页面的时候
用<%= uname %>拿到的还是'md'
用${requestScope.uname}拿到的却是新覆盖的'**'
<h1>输入内容为:<%= name%></h1>
<h1>输入内容为:${requestScope.uname}</h1>
原因:
分析:通过下面JSP运行的结构图,可以发现,当我们访问hello.jsp时,jsp引擎会预处理生成对应的hello_jsp.java,之后编译成hellow_jsp.class,编译过程中服务器会对原生的java代码进行解析和执行(也就是完成了<%=%>),之后在Servlet实例化成对象。在之后的运行的过程,才会被Filter过滤,等到处理完成返回视图层渲染时,EL表达式才会起作用,然而此时request中key为'md'的对应值'**'