`
247687009
  • 浏览: 174552 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SpringMVC3.2.x整合fastJson实现JSONP服务端

    博客分类:
  • JS
 
阅读更多

         因为安全因素,ajax是不能进行跨域请求的,但是机智的程序员们发明了JSONP。Jsonp(JSON with Padding)是资料格式 json 的一种“使用模式”,可以让网页从别的网域获取资料。比如在www.baidu.com域名下可以请求google.com/v1/ajax.json。在前后分离开发的场景下,JSONP的意义重大呀。

         由于使用angularJS对前后的开发进行了分离(页面和控制器跑在不同的服务器之中,java代码跑在jetty上,angularJS跑在nginx上),他们之间需要进行测试通信。这时候就得用到JSONP。

         开始快乐的改造之旅,打算使用的技术就是fastJson+SpringMVC的组合,首先是3.2之前的整合方式,注意是3.2之前。目前最新版的Fastjson是不能直接支持JSONP的需要添加一些类来帮助完成。

首先是一个数据载体,因为jsonp要求的格式如下。

 

 

fn_name (myData)

 

 

既然需要这样的结果,就构造这么一个数据载体

 

package org.soa.rest.jsonp;

/**
 * Fastjson的JSONP消息对象
 * @author liuyi
 *
 */
public class JSONPObject {

    private String function;//JSONP回调方法
    private Object json;//真正的Json对象

    public JSONPObject(String function, Object json) {
        this.function = function;
        this.json = json;
    }

    //getter setter
}

 

 

Spring提供了灰常方便的注解@ResponseBody的方式返回json数据,在3.2之后的版本中,只要在spring-mvc的配置文件中加入

 

<mvc:annotation-driven> 

 

 

就默认使用jackson来进行处理底层的转换,这里我们使用FastJSON,因为需要支持jsonp所有需要对已有的转换器进行修改。

/**
 * 支持JSONP的Fastjson的消息转换器
 * @author liuyi
 *
 */
public class FastJsonHttpMessageConverter extends com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter {
    @Override
    protected void writeInternal(Object obj, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
    	if (obj instanceof JSONPObject) {
            JSONPObject jsonp = (JSONPObject) obj;
            OutputStream out = outputMessage.getBody();
            String text = jsonp.getFunction() + "(" + JSON.toJSONString(jsonp.getJson(), getFeatures()) + ")";
            System.out.println(text);
            byte[] bytes = text.getBytes(getCharset());
            out.write(bytes);
        } else {
            super.writeInternal(obj, outputMessage);
        }
    } 
}

 

注册到spring中

 

	<bean id="fastJsonHttpMessageConverter"
		class="org.soa.rest.jsonp.FastJsonHttpMessageConverter">
		<property name="supportedMediaTypes">
			<list>
				<value>application/json;charset=UTF-8</value>
				<value>text/html;charset=UTF-8</value>
			</list>
		</property>
		<property name="features" >
		   <list>
		  <value>WriteNullBooleanAsFalse</value>
		  <value>QuoteFieldNames</value>  
                <value>WriteDateUseDateFormat</value> 
                <value>WriteNullStringAsEmpty</value>  
		   </list>
		</property>
	</bean>

 

 

3.2之前在只需要加入下面这段配置自定义的转换器就能工作了

!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="fastJsonHttpMessageConverter" /><!-- json转换器 -->
            </list>
        </property>

 

在3.2中测试上面放法失效,折腾了多久总算找到解决方式,需要加入以下配置,简单的说就是要把转化器配置在mvc:annotation-driven中。

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager">
	<mvc:message-converters register-defaults="false">
		<ref bean="fastJsonHttpMessageConverter"/>
	</mvc:message-converters>
</mvc:annotation-driven> 

    <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="true" />
    <property name="ignoreAcceptHeader" value="false" /> 
    <property name="mediaTypes" >
        <value>
            json=application/json
            xml=application/xml
        </value>
    </property>
</bean>

 

控制器中的代码

	@ResponseBody
	@RequestMapping(value="/sys/invoker"
					,method={RequestMethod.GET,RequestMethod.POST})
	public JSONPObject login(@ModelAttribute SoaContext context,HttpServletRequest request,String callback) {
		final long begin  = System.currentTimeMillis();
		final Enumeration<String> names = request.getParameterNames();
		while (names.hasMoreElements()) {
			String key = names.nextElement();
			if(key.intern() == "method".intern() ||key.intern() == "service".intern()) continue;
			context.addAttr(key, request.getParameter(key));
		}
		context = soaManger.callNoTx(context);
		SoaLogger.debug(getClass(), "service {} in method {}执行时间{}ms",context.getService(),context.getMethod(), System.currentTimeMillis()-begin);
               //只要放回Jsonp对象即可
		return new JSONPObject(callback,context);
	}

 

客户端代码

(function() {
				$.ajax({
					url: "http://localhost:8080/soa-rest/sys/invoker?service=userService&method=page",
					dataType: 'jsonp',
					data: '',
					jsonp: 'callback',
					success: function(result) {
							console.log(result);
					},
					timeout: 3000
				});

 

到此整合完成;

参考文档:http://stackoverflow.com/questions/14333709/spring-mvc-3-2-and-json-objectmapper-issue

完整列子:https://github.com/247687009/soa/

2
0
分享到:
评论
1 楼 fzlme55 2015-01-14  
好文章,学习了~~~~ @roceys

相关推荐

    springmvc, spring5.x , hibernate5.x 整合

    Spring 5.x带来了许多性能改进和新特性,如Reactor支持以实现响应式编程,以及对Java 8和Java EE 8的全面兼容。Spring框架的核心是依赖注入(DI),它允许开发者创建松耦合的组件,便于测试和维护。 Hibernate 5.x...

    1、手写springmvc框架及分析springmvc源码.zip

    1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析...

    spring4.x+springMVC4.x+mybatis3.x+ehcache2.6.x整合

    以前都是用SSH,第一次使用spring+springMVC+mybatis自己做的测试练习,主要是配置注解的使用,加了稍微详细的注释说明。另外在测试ehcache的时候也继承进去了,紧做练习参考. 环境:tomcat使用7.x,JDK1.7开发工具...

    springMVC3.2+Hibernate4的基本配置

    在本文中,我们将深入探讨如何配置一个基于SpringMVC 3.2和Hibernate 4的基础项目。这个项目配置涵盖了核心的框架组件,如数据库连接池、事务管理、缓存策略以及拦截器,这些是构建现代Java Web应用的关键要素。我们...

    框架springmvc3.2+spring3.2+mybatis3.11+maven整合

    SSM(Spring MVC + Spring + MyBatis)是Java Web开发中常见的三层架构组合,而Spring MVC 3.2、Spring 3.2和MyBatis 3.11是这套框架组合的特定版本。本项目是将这些框架通过Maven进行整合,方便在MyEclipse环境中...

    springMVC整合FastJson实现RestFul风格API

    本文将详细介绍如何在Spring MVC项目中整合FastJson,实现RESTful风格的API。 首先,我们需要在项目中引入Spring MVC和FastJson的相关依赖。在Maven的pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;org.spring...

    SpringMVC4.x案例和配置

    SpringMVC4.x是Spring框架的一个重要组成部分,用于构建Web应用程序的模型-视图-控制器(MVC)架构。在本案例中,我们将深入探讨SpringMVC4.x的配置和应用,结合博客园的java web教程,以帮助你更好地理解和实践这一...

    SpringMVC笔记.md

    SpringMVC笔记,记录的比较完整,参考价值较高,大家共同进步

    尚硅谷佟刚SpringMVC 4.X视频教程---对应课件信息

    【SpringMVC 4.X详解】 SpringMVC是Spring框架的一部分,主要用于构建Web应用程序的后端控制器。在SpringMVC中,请求由DispatcherServlet前端控制器处理,它将请求分发到相应的处理器,然后处理器完成业务逻辑后...

    springmvc基础.docx

    springmvc基础 包含代码+知识点+详细解释 ...4. springmvc和mybatis整合 5. springmvc注解开发 常用的注解学习 参数绑定(简单类型、pojo、集合类型) 自定义参数绑定 6. springmvc和struts2区别

    springmvc4.x框架所需jar包

    aopalliance-1.0.jar commons-logging-1.1.1.jar spring-aop-4.2.4.RELEASE.jar spring-aspects-4.2.4.RELEASE.jar spring-beans-4.2.4.RELEASE.jar spring-context-4.2.4.RELEASE.jar spring-context-support-4.2.4...

    springmvc简单框架提供的jsonp服务端接口

    本篇文章将深入探讨如何利用SpringMVC框架构建一个简单的服务端接口,提供JSONP(JSON with Padding)服务。 JSONP是一种跨域数据交互协议,通过动态插入`&lt;script&gt;`标签来实现JavaScript获取非同源服务器的数据。在...

    springmvc 3.2(jar包)

    8. **AOP(面向切面编程)**: SpringMVC 3.2集成了Spring的AOP模块,允许开发者定义切面,实现如日志记录、事务管理等功能。 9. **国际化与本地化**: 支持基于不同语言和地区的消息资源文件,提供动态的多语言支持...

    springMVC整合FastJson实现RestFul风格API涉及jar包

    本教程将详细介绍如何在Spring MVC项目中整合FastJson,以便实现RESTful风格的API。 首先,理解RESTful风格的API至关重要。REST(Representational State Transfer,表述性状态转移)是一种网络应用程序的设计风格...

    SpringMVC pom.xml

    SpringMVC所需的依赖,包含logback的依赖详情,maven项目的基本依赖。 2020/06/02-很久之前的了忘记里面,看见所需的积分太高了,重新设置一下

    SpringMVCC.zip

    SpringMVC是Spring框架的一部分,专门用于构建Web应用程序的模型-视图-控制器(MVC)架构。在本文中,我们将深入探讨SpringMVC 5.1.5.RELEASE版本的关键特性和使用方法,这对于初学者理解如何在Eclipse环境中搭建...

    框架springmvc3.2+spring3.2+mybatis3.11整合附带jar包

    SSM整合是Java Web开发中常见的一种框架组合,由Spring MVC、Spring和MyBatis三个组件构成。这个压缩包提供了一种便捷的方式,让你能在MyEclipse环境中快速搭建基于SSM的项目。以下是对这三个核心组件及其整合过程的...

    SpringMVC4教程

    基于SpringMVC4.x目前最详细的中文教程 内容是PPT

Global site tag (gtag.js) - Google Analytics