springMVC实现jsonp


 jsonp原理

js 是可以访问跨域资源的(通过ajax异步请求,或者通过src标签),但是浏览器对js的跨域做了限制,通过jsonp原理跳出浏览器限制,在页面中定义一个回调函数,来获取到资源.


springMvc4.1之后:

①@ControllerAdvice加上这个注解

②实现AbstractJsonpResponseBodyAdvice

如下:


springMvc4.1之前:

方法:继承原来的消息处理器,然后加上自已的消息处理内容

①新建一个类继承MappingJackson2HttpMessageConverter

②重写writeInternal方法

③在mvc注解驱动中配置自定义的消息处理器

代码实现如下:

--------------------------------------------------------------------------------------------------------------------

public class JsonpHttpMessageConverter extends MappingJackson2HttpMessageConverter{

 

    //做一个jsonp支持标识

    private String callbackName;

    

    @Override

    protected void writeInternal(Object object, HttpOutputMessage outputMessage){

        //如何获取HttpServletRequest

        HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();

        

        String methodName = request.getParameter(callbackName);

        

        try {

            if (StringUtils.isEmpty(methodName)) {

                //没有callback函数,走原来的json格式支持

                super.writeInternal(object, outputMessage);

            }else{

                //有callback方法名,支持jsonp

                JsonEncoding jsonEncoding = getJsonEncoding(outputMessage.getHeaders().getContentType());

                

                String result = methodName+"("+super.getObjectMapper().writeValueAsString(object)+")";

                

                IOUtils.write(result, outputMessage.getBody(),jsonEncoding.getJavaName());

            }

        } catch (Exception e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }      

    }

}

------------------------------------------------------------------------------------------------------------------

<!-- 注解驱动 -->

<mvc:annotation-driven>

<mvc:message-converters>

<!-- 默认的消息处理器字符串类型消息处理器 -->

<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">

<constructor-arg index="0" value="UTF-8"/>

</bean>

<!-- 自定义消息处理器 -->

<bean id="jsonpHttpMessageConverter" class="com.atguigu.sso.message.converter.JsonpHttpMessageConverter">

<!-- 设置属性值:请求的方法名的参数  -->

<property name="callbackName" value="callback"/>

</bean>

</mvc:message-converters>

</mvc:annotation-driven>

-----------------------------------------------------------------------------------------------------------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值