zoukankan      html  css  js  c++  java
  • SpringMVC:拦截器和POST中文乱码问题

    SpringMVC:拦截器和POST中文乱码问题

    1、拦截器

    Spring MVC 中的拦截器(Interceptor)类似于 Servlet 中的过滤器(Filter),它主要用于拦截用户请求并做出相应的处理。

    过滤器与拦截器的区别:拦截器是AOP思想的具体应用。

    过滤器

    • servlet规范中的一部分,任何java web工程都可以使用
    • 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

    拦截器

    • 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
    • 拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的

    自定义拦截器的实现:

    通过实现 HandlerInterceptorAdapter 接口,并向 Spring MVC 注册既可使用自定义拦截器。

    HandlerInterceptorAdapter 接口提供了三个方法:

    • preHandle() 在业务处理器处理请求之前被调用

      • 该方法会在 Controller 方法前执行
      • 返回值表示是否继续后续操作:
      • 返回 true 时,表示继续向下执行;
      • 返回 false 时,会中断后续所有操作(包括调用下一个拦截器和 Controller 中的方法执行)。
    • postHandle() 在业务处理器处理请求执行完成后,生成视图之前执行

      • 在 Controller 方法调用之后,且解析视图之前执行。
      • 可以通过此方法对模型和视图做出进一步修改。
    • afterCompletion() 在 DispatcherServlet 完全处理完请求后被调用,可用于清理资源等。

      • 该方法会在整个请求完成(即,视图渲染结束)之后执行。
      • 可以通过此方法实现一些资源清理、记录日志信息等工作。
    public class MyInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            return false;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
        }
    }
    

    Spring-web.xml配置:

    <mvc:interceptors>
      <bean class="com.xu.web.interceptor.MyInterceptor1"/> <!-- 1 -->
    
      <mvc:interceptor> <!-- 2 -->
        <mvc:mapping path="/**"/> <!-- 3 -->
        <mvc:exclude-mapping path=""/> <!-- 4 -->
        <bean class="com.xu.web.interceptor.MyInterceptor2"/> <!-- 5 -->
      </mvc:interceptor>
    
      <mvc:interceptor> <!-- 6 -->
        <mvc:mapping path="/hello"/> <!-- 7 -->
        <bean class="com.xu.web.interceptor.MyInterceptor3"/> <!-- 8 -->
      </mvc:interceptor>
    
    </mvc:interceptors>
    
    • 1 所示,在 interceptors 下注册的拦截器是全局拦截器,会拦截所有请求
    • 2 | 6 所示,在 interceptor 下注册的拦截器是局部拦截器,需要明确配置该拦截器拦截哪些请求。
    • 3 所示,表示拦截所有路径
    • 4 所示,表示在拦截某些请求的前提下,排除/不拦截某些请求
    • 7 所示,表示拦截所有以 /hello 开头的路径

    当设置多个拦截器时,先按顺序调用 preHandle 方法,然后逆序调用每个拦截器的 postHandleafterCompletion 方法,即:

    • A-pre
    • B-pre
    • C-pre
    • C-post
    • C-after
    • B-post
    • B-after
    • A-post
    • A-after

    2、POST请求中文乱码

    Spring MVC 专门提供了一个 Filter 用于解决 POST 请求乱码问题,只需要在 web.xml 文件中配置使用即可:

    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    get 请求,一般可以通过修改 tomcat 配置设置文件解决。

  • 相关阅读:
    【bzoj3782】上学路线 dp+容斥原理+Lucas定理+中国剩余定理
    【bzoj3210】花神的浇花集会 旋转坐标系
    【bzoj3513】[MUTC2013]idiots FFT
    【bzoj1043】[HAOI2008]下落的圆盘 计算几何
    【bzoj2521】[Shoi2010]最小生成树 网络流最小割
    【bzoj4811】[Ynoi2017]由乃的OJ 树链剖分+线段树区间合并
    【bzoj2467】[中山市选2010]生成树 矩阵树定理
    【bzoj1002】[FJOI2007]轮状病毒 矩阵树定理+高精度
    【bzoj4031】[HEOI2015]小Z的房间 矩阵树定理
    【bzoj4292】[PA2015]Równanie 暴力
  • 原文地址:https://www.cnblogs.com/whitespaces/p/12455031.html
Copyright © 2011-2022 走看看