发表于: 2017-01-06 22:45:47
1 2016
今天完成的事情:
继续框架学习
明天计划的事情:
1、继续学习框架
2、继续任务,待定
遇到的问题:
1、遇到一个问题还没来得及解决,浏览器通过表单提交中文时,
后台接收要在控制台输出,
结果控制台中文乱码,明天解决这个问题。
2、进度确实挺慢,一天时间学不了多少东西,还有各种杂事要应付
收获:
web项目如果运行在Tomcat 8下,表单通过隐藏域发送DELETE和PUT请求,到达控制器后,返回时(forward)会报HTTP 405的错误提示。
三种解决方案:
a、将 Tomcat 8 改为 Tomcat 7,在Tomcat 7 下运行是正常的;
b、将请求转发(forward)改为请求重定向(redirect);
c、自己手动写一个Filter来包装HttpRequest中的getMethod()方法
其中第三种做法,大致流程:
1)客户端发送请求至服务器,这时如果发送的是POST请求且带有以_method为名的参数会被Spring的HiddenHttpMethodFilter给拦截;
2)HiddenHttpMethodFilter内有一个静态内部类通过继承HttpServletRequestWrapper类并重写getMethod()方法,将该方法返回值设为_method隐藏域的值;
3)HiddenHttpMethodFilter在包装好Request后,将请求发往服务器的控制器中对应的方法处理器;
4)服务器处理完请求后,产生了一个forward请求,产生相应的请求处理信息发往客户端,注意这时的request的getMethod()方法仍然是HiddenHttpMethodFilter包装过的;
5)我们需要在服务器的响应请求到达客户端前进行拦截,这也是最关键的一步,通过自定义过滤器MyHttpMethodFilter进一步包装请求,将getMethod()方法返回值改成POST或GET即可;
6)在web.xml中配置该filter,注意dispatcher结点值必须为FORWARD。
评论