zoukankan      html  css  js  c++  java
  • SpringMvc Controller请求链接忽略大小写(包含拦截器)及@ResponseBody返回String中文乱码处理

    SpringMvc Controller请求链接忽略大小写(包含拦截器)及@ResponseBody返回String中文乱码处理。。。

    @RequestMapping(value = "/tests", method = RequestMethod.POST)
    @ResponseBody
    public String tests(HttpServletRequest request){
        return "我是";
    }


    比如我们有这么个请求,返回的是“我是”这么一个中文字符串,请求链接是“/tests”,先处理返回中文乱码问题.

    1)我们一般会在springmvc启动配置文件中配置这么一段StringHttpMessageConverter的转换器,但即使是配置了也不管用:
      
    <!-- 对包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
        <context:component-scan base-package="com.web.controller" use-default-filters="false">
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    
        <aop:aspectj-autoproxy/>
    
        <!-- 开启@controller注解,同时解决返回中文乱码问题 -->
        <mvc:annotation-driven>
            <mvc:message-converters>
                <!--<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/>-->
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <constructor-arg value="UTF-8"/>
                </bean>
                <!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
                <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <!-- 这里顺序不能反,一定先写text/html,不然ie下出现下载提示 -->
                            <value>text/html;charset=UTF-8</value>
                            <value>application/json;charset=UTF-8</value>
                        </list>
                    </property>
                    <property name="features">
                        <list>
                            <value>WriteMapNullValue</value>
                            <value>DisableCircularReferenceDetect</value>
                        </list>
                    </property>
                </bean>
            </mvc:message-converters>
        </mvc:annotation-driven>

      请注意上面这段配置,是先扫包,后启用SpringMVC驱动器转换器的配置,这样配置返回json出现下载链接的问题是解决了,但是返回中文字符串乱码问题并没有解决,如何解决呢?很简单,讲扫包和驱动器的位置对调一下,配置如下即可:

      

        <!-- 开启@controller注解,同时解决返回中文乱码问题 -->
        <mvc:annotation-driven>
            <mvc:message-converters>
                <!--<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/>-->
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <constructor-arg value="UTF-8"/>
                </bean>
                <!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
                <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <!-- 这里顺序不能反,一定先写text/html,不然ie下出现下载提示 -->
                            <value>text/html;charset=UTF-8</value>
                            <value>application/json;charset=UTF-8</value>
                        </list>
                    </property>
                    <property name="features">
                        <list>
                            <value>WriteMapNullValue</value>
                            <value>DisableCircularReferenceDetect</value>
                        </list>
                    </property>
                </bean>
            </mvc:message-converters>
        </mvc:annotation-driven>
    
        <!-- 对包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
        <context:component-scan base-package="com.web.controller" use-default-filters="false">
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    
        <aop:aspectj-autoproxy/>

      2)Controller请求链接忽略大小写(拦截器)

        网上很多资料是这么配置的,加一个继承自

    WebMvcConfigurationSupport的转换类,它的作用是将所有@RequestMapping的请求均转换为小写,这样做请求问题是解决了,如上用http://localhost:8080/tets或者http://localhost:8080/Tests都能请求到,但是如果

    配置了<mvc:interceptors>拦截器,拦截器是拦截不到的,拦截器就成了瞎子不起作用了,通常配置如下(这段配置拦截器不管用)

        

    @Configuration
    public class WebConfig extends WebMvcConfigurationSupport {
    
        @Override
        public void configurePathMatch(PathMatchConfigurer configurer) {
            AntPathMatcher matcher = new AntPathMatcher();
            matcher.setCaseSensitive(false);
            configurer.setPathMatcher(matcher);
        }
    }

        正确的做法如下,继承自AntPathMatcher路径匹配:

       

    public class CaseInsensitivePathMatcher extends AntPathMatcher {
    
        protected boolean doMatch(String pattern, String path, boolean fullMatch, Map uriTemplateVariables) {
            return super.doMatch(pattern.toLowerCase(), path.toLowerCase(), fullMatch, uriTemplateVariables);
        }
    }

        然后将这个类加入</mvc:annotation-driven>内,如下:

    <bean id="caseInsensitivePathMatcher" class="com.web.interceptor.CaseInsensitivePathMatcher"/>
        <mvc:annotation-driven>
            <mvc:message-converters>
                <!--<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/>-->
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <constructor-arg value="UTF-8"/>
                </bean>
                <!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
                <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <!-- 这里顺序不能反,一定先写text/html,不然ie下出现下载提示 -->
                            <value>text/html;charset=UTF-8</value>
                            <value>application/json;charset=UTF-8</value>
                        </list>
                    </property>
                    <property name="features">
                        <list>
                            <value>WriteMapNullValue</value>
                            <value>DisableCircularReferenceDetect</value>
                        </list>
                    </property>
                </bean>
            </mvc:message-converters>
            <mvc:path-matching path-matcher="caseInsensitivePathMatcher"/>
        </mvc:annotation-driven>

    所以,如上两个问题合起来配置如下:

      

    <!-- 开启@controller注解,同时解决返回中文乱码问题 -->
        <bean id="caseInsensitivePathMatcher" class="com.web.interceptor.CaseInsensitivePathMatcher"/>
        <mvc:annotation-driven>
            <mvc:message-converters>
                <!--<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/>-->
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <constructor-arg value="UTF-8"/>
                </bean>
                <!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
                <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <!-- 这里顺序不能反,一定先写text/html,不然ie下出现下载提示 -->
                            <value>text/html;charset=UTF-8</value>
                            <value>application/json;charset=UTF-8</value>
                        </list>
                    </property>
                    <property name="features">
                        <list>
                            <value>WriteMapNullValue</value>
                            <value>DisableCircularReferenceDetect</value>
                        </list>
                    </property>
                </bean>
            </mvc:message-converters>
            <mvc:path-matching path-matcher="caseInsensitivePathMatcher"/>
        </mvc:annotation-driven>
    
    
        <!--<mvc:annotation-driven>
    
        </mvc:annotation-driven>-->
    
        <!-- 对包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
        <context:component-scan base-package="com.web.controller" use-default-filters="false">
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    
        <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="locations">
                <list>
                    <value>classpath*:properties/*.properties</value>
                </list>
            </property>
            <property name="fileEncoding" value="UTF-8" />
            <property name="ignoreUnresolvablePlaceholders" value="true" />
        </bean>
    
        <aop:aspectj-autoproxy/>
  • 相关阅读:
    一道面试题:按照其描述要求用java语言实现快速排序
    Tomcat容器运行struts2+spring+mybatis架构的java web应用程序简单分析
    关于oracle存储过程的一些知识点
    多动手试试,其实List类型的变量在页面上取到的值可以直接赋值给一个js的Array数组变量
    Chapter 5: Container
    统计文件夹下java代码行数的小程序--主要是学习任务队列的思想
    利用strut2标签自动生成form前端验证代码
    简单实现web单点登录
    Chapter 4: Tomcat Default Connector
    [python] 格式化方法 format
  • 原文地址:https://www.cnblogs.com/dbaxyx/p/8509174.html
Copyright © 2011-2022 走看看