过滤器中的代码:
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; chain.doFilter(new HTMLCharacterRequest(req), resp); }
HTMLCharacterRequest:
public HTMLCharacterRequest(HttpServletRequest request) { super(request); } @Override public String getParameter(String name) { return filter(super.getParameter(name)); } private String filter(String parameter) { if(StringHelper.isNullOrEmpty(parameter)){ return null; } return StringEscapeUtils.escapeSql(StringHelper.unescape(parameter)); }
这样过滤后 在Controller里面可以使用request.getParameter("xxx")的方式可以获取到处理之后的信息,例如:
前台传递的参数为:escase("你好!")
通过request.getParameter("xxx") 能够获取到 "你好!"
但是通过注解的方式却是未解码的数据:
@RequestMapping("addNewProvince") public @ResponseBody Map<String, Object> addNewProvince( @RequestParam("provinceName") String provinceName, @RequestParam("operatorType") String operatorType, @RequestParam("desc") String desc, HttpServletRequest request)
什么原因啊?
Spring用的不是你封装后的HTMLCharacterRequest对象,而是封装前的实现了HttpServletRequest接口的对象。和Spring的内部实现有关。你封装的HTMLCharacterRequest对象只有过滤完以后,转到Controller里面的时候才会得到。而Spring并没有使用FilterChain最终输出的request和response。
你可以改成下面这样试一试(估计是不可以,呵呵):
@RequestParam("desc") String desc, HTMLCharacterRequest request)
Spring中有下面这些实现了HttpServletRequest接口的类,传给你的对象有可能是下面之中的一种。当然这些对象也是对tomcat提供的对象的封装,就像你的HTMLCharacterRequest类一样。
FacesWebRequest,
NativeWebRequest,
PortletWebRequest,
DispatcherServletWebRequest,
ServletWebRequest
Spring的源码没有研究过,所以只能理解到这了,希望能给你一些提示。