(配置消息转换器) sso单点登入之jsonp改进版

本文介绍了一种改进的JSONP支持方法,通过在Spring MVC项目中使用自定义的CallbackMappingJackson2HttpMessageConverter类,实现更简洁的数据返回。此方法无需在控制器中手动封装callback(json数据),简化了开发流程。

原:

后台controller中 需要 返回 【 callback(json数据)】

 

改进的做法:

改进后所有 后台controller中的接口返回参数不用做任何改变;

之前的格式是需要 返回 【 callback(json数据)】

工具类pom.xml 需要加两个包;

<dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
      </dependency>

      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
      </dependency>

CallbackMappingJackson2HttpMessageConverter.java 工具类

package com.igeek.util;

import java.io.IOException;
import java.lang.reflect.Type;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonProcessingException;
import org.springframework.web.servlet.mvc.method.annotation.AbstractJsonpResponseBodyAdvice;

public class CallbackMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {

    // 做jsonp的支持的标识,在请求参数中加该参数
    private String callbackName;

    @Override
    protected void writeInternal(Object o, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        // 从threadLocal中获取当前的Request对象
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
                .currentRequestAttributes()).getRequest();
        String callbackParam = request.getParameter(callbackName);
        System.out.println("获取callback------>"+callbackName+"=====>"+callbackParam);
        if (StringUtils.isEmpty(callbackParam)) {
            // 没有找到callback参数,直接返回json数据
            super.writeInternal(o, outputMessage);
        } else {
            JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType());
            try {
                String result = callbackParam + "(" + super.getObjectMapper().writeValueAsString(o)
                        + ");";
                IOUtils.write(result, outputMessage.getBody(), encoding.getJavaName());
            } catch (JsonProcessingException ex) {
                throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
            }
        }
    }



    /*@Override
    protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException,
            HttpMessageNotWritableException {
        // 从threadLocal中获取当前的Request对象
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
                .currentRequestAttributes()).getRequest();
        String callbackParam = request.getParameter(callbackName);
        System.out.println("获取callback------>"+callbackName+"=====>"+callbackParam);
        if (StringUtils.isEmpty(callbackParam)) {
            // 没有找到callback参数,直接返回json数据
            super.writeInternal(object, outputMessage);
        } else {
            JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType());
            try {
                String result = callbackParam + "(" + super.getObjectMapper().writeValueAsString(object)
                        + ");";
                IOUtils.write(result, outputMessage.getBody(), encoding.getJavaName());
            } catch (JsonProcessingException ex) {
                throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
            }
        }

    }*/

    public String getCallbackName() {
        return callbackName;
    }

    public void setCallbackName(String callbackName) {
        this.callbackName = callbackName;
    }

}

 

配置消息转换器:(提供服务的项目 SpringMVC.xml )中配置

	<!-- 配置注解驱动 -->
	<!-- 配置消息转换器-->
	<mvc:annotation-driven>


			<mvc:message-converters register-defaults="true">
              <!-- (解决中文乱码问题)-->
				<!--<bean 
             class="org.springframework.http.converter.StringHttpMessageConverter" >
					<constructor-arg index="0" value="UTF-8"></constructor-arg>
				</bean>-->
				<!--定义消息转换器时指定回调函数的名称-->
				<bean class="com.igeek.util.CallbackMappingJackson2HttpMessageConverter">
					<property name="callbackName" value="callback"></property>
				</bean>

			</mvc:message-converters>
	</mvc:annotation-driven>

 

页面 index.jsp 跨域获取数据

   /**
	 * 通过ajax请求加载内容数据
     */
	$.ajax({
	    url:'http://manage.ebuy.com/api/content/list/89',
		type:'get',
		dataType:'jsonp',
        jsonp:'callback',//jsonp类型:String 在一个 jsonp 请求中重写回调函数的名字。
        success:function(data){
	        if(data.status==200){
                for (var i in data.data){
                    var li_ele = '<li><a name=\"sfbest_hp_hp_focus_1\" class=\"fore_pic trackref\" href=\"'+data.data[i].url+'\" target=\"_blank\">' +
                        '<img id=\"lunbo_1\" alt=\"'+data.data[i].content+'\" src=\"'+data.data[i].pic+'\"></a></li>';
                    $("#ebuy_banner").html($("#ebuy_banner").html()+li_ele);

                    var idx_ele = '<li class=\"'+(i==0?"cur":"")+'\">'+(parseInt(i)+1)+'</li>';
                    $("#lunboNum").html($("#lunboNum").html()+idx_ele);
                }

                SFbest.Slide.init();
			}

		}
    });

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_无往而不胜_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值