zoukankan      html  css  js  c++  java
  • SpringMVC中fastjson支持jsonp的实现

    前边一篇文章主要说了下前端处理jsonp的方式,这篇主要介绍了后台接收和响应jsonp的一种方式

    继承fastjson消息转换器类:com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter

    package com.caiya.hongbao.web;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.serializer.SerializerFeature;
    import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
    import org.springframework.http.HttpOutputMessage;
    import org.springframework.http.converter.HttpMessageNotWritableException;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.nio.charset.Charset;
    
    /**
     * fastjson消息转换器
     * Created by caiya on 15/12/23.
     */
    public class MJFastJsonHttpMessageConverter extends FastJsonHttpMessageConverter {
        public static final Charset UTF8 = Charset.forName("UTF-8");
        private Charset charset;
        private SerializerFeature[] features;
    
        public MJFastJsonHttpMessageConverter() {
            super();
            this.charset = UTF8;
            this.features = new SerializerFeature[0];
        }
    
        @Override
        protected void writeInternal(Object obj, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
            // obj就是controller中注解为@ResponseBody的方法返回值对象
            if(obj instanceof JSONPObject){
                JSONPObject jsonpObject = (JSONPObject)obj;
                OutputStream out = outputMessage.getBody();
                String text = JSON.toJSONString(jsonpObject.getJson(), this.features);
                String jsonpText = new StringBuilder(jsonpObject.getFunction()).append("(").append(text).append(")").toString();
                byte[] bytes = jsonpText.getBytes(this.charset);
                out.write(bytes);
            }else{
                    super.writeInternal(obj, outputMessage);
                }
        }
    }

    JSONPObject类:

    package com.caiya.hongbao.web;
    
    import java.io.Serializable;
    
    /**
     * Created by caiya on 15/12/23.
     */
    public class JSONPObject implements Serializable {
    
        private static final long serialVersionUID = -7634081032767024781L;
    
        private String function;
    
        private Object json;
    
        public JSONPObject(String function, Object json){
            this.function = function;
            this.json = json;
        }
    
        public String getFunction() {
            return function;
        }
    
        public Object getJson() {
            return json;
        }
    
        public JSONPObject setFunction(String function) {
            this.function = function;
            return this;
        }
    
        public JSONPObject setJson(Object json) {
            this.json = json;
            return this;
        }
    
    }

    spring-web.xml配置:

    <bean id="fastJsonHttpMessageConverter"
         class="com.caiya.hongbao.web.MJFastJsonHttpMessageConverter">
       <property name="supportedMediaTypes">
          <list>
             <value>text/html;charset=UTF-8</value>
             <value>application/json;charset=UTF-8</value>
          </list>
       </property>
    </bean>
    <mvc:annotation-driven>
       <mvc:message-converters>
          <ref bean="fastJsonHttpMessageConverter" />
       </mvc:message-converters>
    </mvc:annotation-driven>

    controller实例:

    /**
     * 个人中心红包列表、红包匹配列表
     * @param status
     * @param channel
     * @param shouldPay
     * @param orderField
     * @param orderType
     * @param page
     * @return
     */
    @RequestMapping(value = "/user/hongbao/list", method = RequestMethod.GET)
    @ResponseBody
    public Object hongbaoList(Integer status, String channel, Long shouldPay, String orderField, String orderType, Page page, String callback) throws SessionException {
        ......
        UserHongbaos userHongbaos = ......
        // 如果callback不为空,那么返回jsonp格式的数据
        if(StringUtils.isNotBlank(callback)){
            return new JSONPObject(callback, userHongbaos);
        }else {
            return userHongbaos;
        }
    }

    摘自:https://my.oschina.net/wnjustdoit/blog/612146

  • 相关阅读:
    【BZOJ 2565】 最长双回文串
    【BZOJ 2160】 拉拉队排练
    【POI 2010】 Antisymmetry
    【HDU 3068】 最长回文
    【POJ 3974】 Palindrome
    【POJ 2503】 Babelfish
    【POJ 3349】 Snowflake Snow Snowflakes
    【BZOJ 2457】 双端队列
    根文件系统的构建与分析(一)之流程分析
    Linux MTD系统剖析
  • 原文地址:https://www.cnblogs.com/tianyuchen/p/6733784.html
Copyright © 2011-2022 走看看