springMVC实现jsonp


 jsonp原理

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


springMvc4.1之后:

①@ControllerAdvice加上这个注解

②实现AbstractJsonpResponseBodyAdvice

如下:

springMVC实现jsonp_第1张图片

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();

        }      

    }

}

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




























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

你可能感兴趣的:(springMVC实现jsonp)