![Page 1: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/1.jpg)
© 2012 SpringOne 2GX 2012. All rights reserved. Do not distribute without permission.
Multi Client Development with SpringJosh Long Spring Developer Advocate, SpringSource, a Division of VMWarehttp://www.joshlong.com || @starbuxman || [email protected]
Sunday, December 9, 12
![Page 2: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/2.jpg)
Spring Developer Advocatetwitter: @starbuxmanweibo: @springsource [email protected]
2
About Josh Long (龙之春)
Sunday, December 9, 12
![Page 3: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/3.jpg)
About Josh LongSpring Developer Advocatetwitter: @[email protected]
Contributor To:
•Spring Integration•Spring Batch •Spring Hadoop•Activiti Workflow Engine•Akka Actor engine
3Sunday, December 9, 12
![Page 4: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/4.jpg)
4
Why Are We Here?
Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.
-Bob Martin
”“
Sunday, December 9, 12
![Page 5: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/5.jpg)
5
do NOT reinvent the Wheel!
Why Are We Here?
Sunday, December 9, 12
![Page 6: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/6.jpg)
6
Spring’s aim:
bring simplicity to java development
web tier &
RIAservice tier batch
processingintegration & messaging
data access
/ NoSQL / Big Data
mobile
tc ServerTomcat
Jetty
lightweight
CloudFoundryGoogle App EngineAmazon BeanStalk
Others
the cloud:
WebSphereJBoss ASWebLogic
(on legacy versions, too!)
traditional
The Spring framework
Sunday, December 9, 12
![Page 7: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/7.jpg)
7
Not All Sides Are Equal
Sunday, December 9, 12
![Page 8: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/8.jpg)
8
Spring Web Support
Sunday, December 9, 12
![Page 9: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/9.jpg)
New in 3.1: XML-free web applications
§ In a servlet 3 container, you can also use Java configuration, negating the need for web.xml:
9
public class SampleWebApplicationInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext sc) throws ServletException {
AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
ac.setServletContext(sc);ac.scan( “a.package.full.of.services”, “a.package.full.of.controllers” );
sc.addServlet("spring", new DispatcherServlet(webContext)); }}
Sunday, December 9, 12
![Page 10: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/10.jpg)
Thin, Thick, Web, Mobile and Rich Clients: Web Core
§Spring Dispatcher Servlet• Objects don’t have to be web-specific.
• Spring web supports lower-level web machinery: ‘• HttpRequestHandler (supports remoting: Caucho, Resin, JAX RPC)• DelegatingFilterProxy. • HandlerInterceptor wraps requests to HttpRequestHandlers• ServletWrappingController lets you force requests to a servlet through the Spring Handler chain • OncePerRequestFilter ensures that an action only occurs once, no matter how many filters are applied. Provides a nice way to avoid duplicate
filters
• Spring provides access to the Spring application context using WebApplicationContextUtils, which has a static method to look up the context, even in environments where Spring isn’t managing the web components
Sunday, December 9, 12
![Page 11: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/11.jpg)
Thin, Thick, Web, Mobile and Rich Clients: Web Core
§Spring provides the easiest way to integrate with your web framework of choice• Spring Faces for JSF 1 and 2
• Struts support for Struts 1
• Tapestry, Struts 2, Stripes, Wicket, Vaadin, Play framework, etc.
• GWT, Flex
Sunday, December 9, 12
![Page 12: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/12.jpg)
Thin, Thick, Web, Mobile and Rich Clients: Spring MVC
12
Sunday, December 9, 12
![Page 13: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/13.jpg)
Spring MVC configuration - config
@Controller public class CustomerController {
}
13
The Anatomy of a Spring MVC @Controller
Sunday, December 9, 12
![Page 14: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/14.jpg)
Spring MVC configuration - config
@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”) public String processTheRequest() { // ... return “home”; }
}
14
The Anatomy of a Spring MVC @Controller
GET http://127.0.0.1:8080/url/of/my/resource
Sunday, December 9, 12
![Page 15: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/15.jpg)
Spring MVC configuration - config
@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public String processTheRequest() { // ... return “home”; }
}
15
The Anatomy of a Spring MVC @Controller
GET http://127.0.0.1:8080/url/of/my/resource
Sunday, December 9, 12
![Page 16: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/16.jpg)
Spring MVC configuration - config
@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public String processTheRequest( HttpServletRequest request) { String contextPath = request.getContextPath(); // ... return “home”; }
}
16
The Anatomy of a Spring MVC @Controller
GET http://127.0.0.1:8080/url/of/my/resource
Sunday, December 9, 12
![Page 17: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/17.jpg)
Spring MVC configuration - config
@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public String processTheRequest( @RequestParam(“search”) String searchQuery ) { // ... return “home”; }
}
17
The Anatomy of a Spring MVC @Controller
GET http://127.0.0.1:8080/url/of/my/resource?search=Spring
Sunday, December 9, 12
![Page 18: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/18.jpg)
Spring MVC configuration - config
@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/{id}”, method = RequestMethod.GET) public String processTheRequest( @PathVariable(“id”) Long id) { // ... return “home”; }
}
18
The Anatomy of a Spring MVC @Controller
GET http://127.0.0.1:8080/url/of/my/2322
Sunday, December 9, 12
![Page 19: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/19.jpg)
Spring MVC configuration - config
@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/{id}” ) public String processTheRequest( @PathVariable(“id”) Long customerId, Model model ) {
model.addAttribute(“customer”, service.getCustomerById( customerId ) ); return “home”; }
@Autowired CustomerService service;
}
19
The Anatomy of a Spring MVC @Controller
GET http://127.0.0.1:8080/url/of/my/232
Sunday, December 9, 12
![Page 20: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/20.jpg)
Spring MVC configuration - config
@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public String processTheRequest( HttpServletRequest request, Model model) { return “home”; }
}
20
The Anatomy of a Spring MVC @Controller
Sunday, December 9, 12
![Page 21: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/21.jpg)
Spring MVC configuration - config
@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public View processTheRequest( HttpServletRequest request, Model model) { return new XsltView(...); }
}
21
The Anatomy of a Spring MVC @Controller
Sunday, December 9, 12
![Page 22: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/22.jpg)
Spring MVC configuration - config
@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public InputStream processTheRequest( HttpServletRequest request, Model model) { return new FileInputStream( ...) ; }
}
22
The Anatomy of a Spring MVC @Controller
Sunday, December 9, 12
![Page 23: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/23.jpg)
Not confidential. Tell everyone.
DEMO§Demos• Simple Spring MVC based Application
Sunday, December 9, 12
![Page 24: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/24.jpg)
24
the new hotness...
Sunday, December 9, 12
![Page 25: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/25.jpg)
25
dumb terminals ruled the earth....
Sunday, December 9, 12
![Page 26: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/26.jpg)
26
then something magical happened: the web
Sunday, December 9, 12
![Page 27: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/27.jpg)
27
but the web didn’t know how to do UI state... so we hacked...
Sunday, December 9, 12
![Page 28: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/28.jpg)
....then the web stopped sucking
28
Sunday, December 9, 12
![Page 29: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/29.jpg)
How Powerful is JavaScript? ...It Boots Linux!!
29
Sunday, December 9, 12
![Page 30: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/30.jpg)
30
REST
Sunday, December 9, 12
![Page 31: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/31.jpg)
CONFIDENTIALCONFIDENTIAL
Thin, Thick, Web, Mobile and Rich Clients: REST
§Origin• The term Representational State Transfer was introduced and defined in 2000 by Roy Fielding in his doctoral dissertation.
§His paper suggests these four design principles:• Use HTTP methods explicitly.
• POST, GET, PUT, DELETE• CRUD operations can be mapped to these existing methods
• Be stateless.• State dependencies limit or restrict scalability
• Expose directory structure-like URIs.• URI’s should be easily understood
• Transfer XML, JavaScript Object Notation (JSON), or both.• Use XML or JSON to represent data objects or attributes
31
Sunday, December 9, 12
![Page 32: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/32.jpg)
REST on the Server
§Spring MVC is basis for REST support• Spring’s server side REST support is based on the standard controller model
§ JavaScript and HTML5 can consume JSON-data payloads
Sunday, December 9, 12
![Page 33: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/33.jpg)
REST on the Client
§RestTemplate• provides dead simple, idiomatic RESTful services consumption
• can use Spring OXM, too.
• Spring Integration and Spring Social both build on the RestTemplate where possible.
§Spring supports numerous converters out of the box• JAXB
• JSON (Jackson)
Sunday, December 9, 12
![Page 34: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/34.jpg)
CONFIDENTIALCONFIDENTIAL
Building clients for your RESTful services: RestTemplate
34
§Google search example
§Multiple parameters
RestTemplate restTemplate = new RestTemplate();
String url = "http://example.com/hotels/{hotel}/bookings/{booking}";
String result = restTemplate.getForObject(url, String.class, "42", “21”);
RestTemplate restTemplate = new RestTemplate();
String url = "https://ajax.googleapis.com/ajax/services/search/web?v=1.0&q={query}";
String result = restTemplate.getForObject(url, String.class, "SpringSource");
Sunday, December 9, 12
![Page 35: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/35.jpg)
CONFIDENTIALCONFIDENTIAL
Thin, Thick, Web, Mobile and Rich Clients: RestTemplate
§RestTemplate class is the heart the client-side story• Entry points for the six main HTTP methods
• DELETE - delete(...)• GET - getForObject(...)• HEAD - headForHeaders(...)• OPTIONS - optionsForAllow(...)• POST - postForLocation(...)• PUT - put(...)• any HTTP operation - exchange(...) and execute(...)
35
Sunday, December 9, 12
![Page 36: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/36.jpg)
Spring MVC configuration - config
@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public @ResponseBody Customer processTheRequest( ... ) { Customer c = service.getCustomerById( id) ; return c; }
@Autowired CustomerService service;
}
36
The Anatomy of a Spring MVC @Controller
Sunday, December 9, 12
![Page 37: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/37.jpg)
Spring MVC configuration - config
@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/someurl”, method = RequestMethod.POST) public String processTheRequest( @RequestBody Customer postedCustomerObject) { // ... return “home”; }
}
37
The Anatomy of a Spring MVC @Controller
POST http://127.0.0.1:8080/url/of/my/someurl
Sunday, December 9, 12
![Page 38: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/38.jpg)
Spring MVC configuration - config
@Controller public class CustomerController { @RequestMapping(value=”/url/of/my/{id}”, method = RequestMethod.POST) public String processTheRequest( @PathVariable(“id”) Long customerId, @RequestBody Customer postedCustomerObject) { // ... return “home”; }
}
38
The Anatomy of a Spring MVC @Controller
POST http://127.0.0.1:8080/url/of/my/someurl
Sunday, December 9, 12
![Page 39: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/39.jpg)
What About the Browsers, Man?
• Problem: modern browsers only speak GET and POST
• Solution: use Spring’s HiddenHttpMethodFilter only then send _method request parameter in the request
<filter> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>hiddenHttpMethodFilter</filter-name> <url-pattern>/</url-pattern> <servlet-name>appServlet</servlet-name> </filter-mapping>
Sunday, December 9, 12
![Page 40: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/40.jpg)
Not confidential. Tell everyone.
DEMO§Demos:• Spring REST service
• Spring REST client
Sunday, December 9, 12
![Page 41: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/41.jpg)
41
Spring Mobile
Sunday, December 9, 12
![Page 42: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/42.jpg)
§Best strategy? Develop Native• Fallback to client-optimized web applications
§Spring MVC 3.1 mobile client-specific content negotiation and rendering • for other devices • (there are other devices besides Android??)
Thin, Thick, Web, Mobile and Rich Clients: Mobile
42
Sunday, December 9, 12
![Page 43: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/43.jpg)
Not confidential. Tell everyone.
DEMO§Demos:• Mobile clients using client specific rendering
Sunday, December 9, 12
![Page 44: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/44.jpg)
44
Spring Android
Sunday, December 9, 12
![Page 45: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/45.jpg)
Thin, Thick, Web, Mobile and Rich Clients: Mobile
45
§Spring REST is ideal for mobile devices§Spring MVC 3.1 mobile client-specific content negotiation and rendering • for other devices
§Spring Android • RestTemplate
Sunday, December 9, 12
![Page 46: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/46.jpg)
OK, so.....
46
Sunday, December 9, 12
![Page 47: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/47.jpg)
Thin, Thick, Web, Mobile and Rich Clients: Mobile
47
CustomerServiceClient - client
! private <T> T extractResponse( ResponseEntity<T> response) {! ! if (response != null && response().value() == 200) {! ! ! return response.getBody();! ! }! ! throw new RuntimeException("couldn't extract response.");! }
! @Override! public Customer updateCustomer(long id, String fn, String ln) { ! ! String urlForPath = urlForPath("customer/{customerId}");! !! ! return extractResponse(this.restTemplate.postForEntity( urlForPath, new Customer(id, fn, ln), Customer.class, id));! }
Sunday, December 9, 12
![Page 48: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/48.jpg)
Thin, Thick, Web, Mobile and Rich Clients: Mobile
§Demos:• consuming the Spring REST service from Android
Sunday, December 9, 12
![Page 49: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/49.jpg)
NOT CONFIDENTIAL -- TELL EVERYONE
Social Communication
49
Sunday, December 9, 12
![Page 50: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/50.jpg)
§Extension to Spring Framework to enable connectivity with Software-as-a-Service providers§Features...• An extensible connection framework
• A connect controller
• Java API bindings
• A sign-in controller
§http://www.springsource.org/spring-social
50
Spring Social
Sunday, December 9, 12
![Page 51: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/51.jpg)
Spring Social Projects
§Spring Social Core§Spring Social Facebook§Spring Social Twitter§Spring Social LinkedIn§Spring Social TripIt§Spring Social GitHub§Spring Social Gowalla§Spring Social Weibo https://github.com/liuce/spring-social-weibo§Spring Social Samples• Includes Showcase, Quickstart, Movies, Canvas, Twitter4J, Popup
51
Sunday, December 9, 12
![Page 52: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/52.jpg)
Spring Social’s Key Components
§Connection Factories• Creates connections; Handles back-end of authorization flow
§Connect Controller• Orchestrates the web-based connection flow
§Connection Repository• Persists connections for long-term use
§Connection Factory Locator• Used by connect controller and connection repository to find connection factories
§API Bindings• Perform requests to APIs, binding to domain objects, error-handling
§Provider Sign-In Controller• Signs a user into an application based on an existing connection
52
Sunday, December 9, 12
![Page 53: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/53.jpg)
Key Steps to Socializing an Application
§Configure Spring Social beans• Connection Factory Locator and Connection Factories
• Connection Repository
• Connect Controller
• API Bindings
§Create connection status views§ Inject/use API bindings
53
Sunday, December 9, 12
![Page 54: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/54.jpg)
Configuration: ConnectionFactoryLocator
54
@Bean@Scope(value="singleton", proxyMode=ScopedProxyMode.INTERFACES) public ConnectionFactoryLocator connectionFactoryLocator() { ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry();
registry.addConnectionFactory( new TwitterConnectionFactory( environment.getProperty("twitter.consumerKey"), environment.getProperty("twitter.consumerSecret")));
registry.addConnectionFactory( new FacebookConnectionFactory( environment.getProperty("facebook.clientId"), environment.getProperty("facebook.clientSecret")));
return registry;}
Sunday, December 9, 12
![Page 55: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/55.jpg)
Configuration: ConnectionFactoryLocator
54
@Bean@Scope(value="singleton", proxyMode=ScopedProxyMode.INTERFACES) public ConnectionFactoryLocator connectionFactoryLocator() { ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry();
registry.addConnectionFactory( new TwitterConnectionFactory( environment.getProperty("twitter.consumerKey"), environment.getProperty("twitter.consumerSecret")));
registry.addConnectionFactory( new FacebookConnectionFactory( environment.getProperty("facebook.clientId"), environment.getProperty("facebook.clientSecret")));
return registry;}
Sunday, December 9, 12
![Page 56: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/56.jpg)
Configuration: ConnectionFactoryLocator
54
@Bean@Scope(value="singleton", proxyMode=ScopedProxyMode.INTERFACES) public ConnectionFactoryLocator connectionFactoryLocator() { ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry();
registry.addConnectionFactory( new TwitterConnectionFactory( environment.getProperty("twitter.consumerKey"), environment.getProperty("twitter.consumerSecret")));
registry.addConnectionFactory( new FacebookConnectionFactory( environment.getProperty("facebook.clientId"), environment.getProperty("facebook.clientSecret")));
return registry;}
Sunday, December 9, 12
![Page 57: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/57.jpg)
Configuration: ConnectionFactoryLocator
54
@Bean@Scope(value="singleton", proxyMode=ScopedProxyMode.INTERFACES) public ConnectionFactoryLocator connectionFactoryLocator() { ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry();
registry.addConnectionFactory( new TwitterConnectionFactory( environment.getProperty("twitter.consumerKey"), environment.getProperty("twitter.consumerSecret")));
registry.addConnectionFactory( new FacebookConnectionFactory( environment.getProperty("facebook.clientId"), environment.getProperty("facebook.clientSecret")));
return registry;}
Sunday, December 9, 12
![Page 58: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/58.jpg)
Configuration: Connection Repository
55
@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public ConnectionRepository connectionRepository() { Authentication authentication = SecurityContextHolder.getContext(). getAuthentication(); if (authentication == null) { throw new IllegalStateException( "Unable to get a ConnectionRepository: no user signed in"); } return usersConnectionRepository().createConnectionRepository( authentication.getName());}
Sunday, December 9, 12
![Page 59: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/59.jpg)
Configuration: Connection Repository
55
@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public ConnectionRepository connectionRepository() { Authentication authentication = SecurityContextHolder.getContext(). getAuthentication(); if (authentication == null) { throw new IllegalStateException( "Unable to get a ConnectionRepository: no user signed in"); } return usersConnectionRepository().createConnectionRepository( authentication.getName());}
@Bean@Scope(value="singleton", proxyMode=ScopedProxyMode.INTERFACES) public UsersConnectionRepository usersConnectionRepository() { return new JdbcUsersConnectionRepository( dataSource, connectionFactoryLocator(), Encryptors.noOpText());}
Sunday, December 9, 12
![Page 60: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/60.jpg)
Configuration: ConnectController
56
@Beanpublic ConnectController connectController() { return new ConnectController(connectionFactoryLocator(), connectionRepository());}
Sunday, December 9, 12
![Page 61: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/61.jpg)
Configuration: ConnectController
56
@Beanpublic ConnectController connectController() { return new ConnectController(connectionFactoryLocator(), connectionRepository());}
Sunday, December 9, 12
![Page 62: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/62.jpg)
Configuration: ConnectController
56
@Beanpublic ConnectController connectController() { return new ConnectController(connectionFactoryLocator(), connectionRepository());}
Sunday, December 9, 12
![Page 63: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/63.jpg)
Configuration: API Bindings
57
@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public Facebook facebook() { Connection<Facebook> facebook = connectionRepository().findPrimaryConnection(Facebook.class); return facebook != null ? facebook.getApi() : new FacebookTemplate();}@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public Twitter twitter() { Connection<Twitter> twitter = connectionRepository().findPrimaryConnection(Twitter.class); return twitter != null ? twitter.getApi() : new TwitterTemplate();}
Sunday, December 9, 12
![Page 64: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/64.jpg)
Configuration: API Bindings
57
@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public Facebook facebook() { Connection<Facebook> facebook = connectionRepository().findPrimaryConnection(Facebook.class); return facebook != null ? facebook.getApi() : new FacebookTemplate();}@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public Twitter twitter() { Connection<Twitter> twitter = connectionRepository().findPrimaryConnection(Twitter.class); return twitter != null ? twitter.getApi() : new TwitterTemplate();}
Sunday, December 9, 12
![Page 65: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/65.jpg)
Configuration: API Bindings
57
@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public Facebook facebook() { Connection<Facebook> facebook = connectionRepository().findPrimaryConnection(Facebook.class); return facebook != null ? facebook.getApi() : new FacebookTemplate();}@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public Twitter twitter() { Connection<Twitter> twitter = connectionRepository().findPrimaryConnection(Twitter.class); return twitter != null ? twitter.getApi() : new TwitterTemplate();}
Sunday, December 9, 12
![Page 66: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/66.jpg)
Configuration: API Bindings
57
@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public Facebook facebook() { Connection<Facebook> facebook = connectionRepository().findPrimaryConnection(Facebook.class); return facebook != null ? facebook.getApi() : new FacebookTemplate();}@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public Twitter twitter() { Connection<Twitter> twitter = connectionRepository().findPrimaryConnection(Twitter.class); return twitter != null ? twitter.getApi() : new TwitterTemplate();}
Sunday, December 9, 12
![Page 67: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/67.jpg)
Injecting and Using the API Bindings
58
@Controllerpublic class TwitterTimelineController {
private final Twitter twitter; @Inject public TwitterTimelineController(Twitter twitter) { this.twitter = twitter; }
@RequestMapping(value="/twitter/tweet", method=RequestMethod.POST) public String postTweet(String message) { twitter.timelineOperations().updateStatus(message); return "redirect:/twitter"; }}
Sunday, December 9, 12
![Page 68: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/68.jpg)
Injecting and Using the API Bindings
58
@Controllerpublic class TwitterTimelineController {
private final Twitter twitter; @Inject public TwitterTimelineController(Twitter twitter) { this.twitter = twitter; }
@RequestMapping(value="/twitter/tweet", method=RequestMethod.POST) public String postTweet(String message) { twitter.timelineOperations().updateStatus(message); return "redirect:/twitter"; }}
Sunday, December 9, 12
![Page 69: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/69.jpg)
Injecting and Using the API Bindings
58
@Controllerpublic class TwitterTimelineController {
private final Twitter twitter; @Inject public TwitterTimelineController(Twitter twitter) { this.twitter = twitter; }
@RequestMapping(value="/twitter/tweet", method=RequestMethod.POST) public String postTweet(String message) { twitter.timelineOperations().updateStatus(message); return "redirect:/twitter"; }}
Sunday, December 9, 12
![Page 70: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/70.jpg)
ConnectController Endpoints§GET /connect• Displays connection status for all providers
§GET /connect/{provider}• Displays connection status for a given provider
§POST /connect/{provider}• Initiates the authorization flow, redirecting to the provider
§GET /connect/{provider}?oauth_token={token}• Handles an OAuth 1 callback
§GET /connect/{provider}?code={authorization code}• Handles an OAuth 2 callback
§DELETE /connect/{provider}• Removes all connections for a user to the given provider
§DELETE /connect/{provider}/{provider user ID}• Removes a specific connection for the user to the given provider
59
Sunday, December 9, 12
![Page 71: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/71.jpg)
ConnectController Flow
60
Service Provider(Twitter, Facebook, etc)
Your Application
ConnectController
Sunday, December 9, 12
![Page 72: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/72.jpg)
ConnectController Flow
60
Service Provider(Twitter, Facebook, etc)
Your Application
ConnectControllerGET /connect/{provider ID}
Display connection status page
Sunday, December 9, 12
![Page 73: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/73.jpg)
ConnectController Flow
60
Service Provider(Twitter, Facebook, etc)
Your Application
ConnectControllerPOST /connect/{provider ID}
Initiate connection flow
Sunday, December 9, 12
![Page 74: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/74.jpg)
ConnectController Flow
60
Service Provider(Twitter, Facebook, etc)
Your Application
ConnectController
Fetch request token (OAuth 1.0/1.0a only)
Sunday, December 9, 12
![Page 75: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/75.jpg)
ConnectController Flow
60
Service Provider(Twitter, Facebook, etc)
Your Application
ConnectController
Redirect browser to provider’s authorization page
Sunday, December 9, 12
![Page 76: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/76.jpg)
ConnectController Flow
60
Service Provider(Twitter, Facebook, etc)
Your Application
ConnectController
Redirect browser to provider’s authorization page
Sunday, December 9, 12
![Page 77: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/77.jpg)
ConnectController Flow
60
Service Provider(Twitter, Facebook, etc)
Your Application
ConnectController
Redirect browser to provider’s authorization page
Sunday, December 9, 12
![Page 78: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/78.jpg)
ConnectController Flow
60
Service Provider(Twitter, Facebook, etc)
Your Application
ConnectController
GET /connect/{provider ID}?oauth_token={token}GET /connect/{provider ID}?code={code}
Provider redirects to callback URL
Sunday, December 9, 12
![Page 79: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/79.jpg)
ConnectController Flow
60
Service Provider(Twitter, Facebook, etc)
Your Application
ConnectController
Exchange request token and/or code for access token
Sunday, December 9, 12
![Page 80: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/80.jpg)
ConnectController Flow
60
Service Provider(Twitter, Facebook, etc)
Your Application
ConnectController
ConnectController stores connection details in connection repository
Sunday, December 9, 12
![Page 81: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/81.jpg)
ConnectController Flow
60
Service Provider(Twitter, Facebook, etc)
Your Application
ConnectController
Application can make API calls via API binding
Sunday, December 9, 12
![Page 82: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/82.jpg)
Connection Status Page View
61
<form action="<c:url value="/connect/twitter" />" method="POST"> <div class="formInfo"> <p> You haven't created any connections with Twitter yet. Click the button to connect with your Twitter account. </p> </div> <p> <button type="submit"> <img src="<c:url value="/resources/social/twitter/connect-with-twitter.png" />"/> </button> </p></form>
Sunday, December 9, 12
![Page 83: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/83.jpg)
Provider Sign In
§A convenience for users§Enables authentication to an app using their connection as credentials§ Implemented with ProviderSignInController§Works consistently with any provider
62
Sunday, December 9, 12
![Page 84: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/84.jpg)
Configuration: ProviderSignInController
§Performs a similar flow as ConnectController§Compares connections (by user ID)§ If there’s a match, the user is signed into the application§Otherwise, the user is sent to signup page• Connection is be established after signup
63
@Beanpublic ProviderSignInController providerSignInController( RequestCache requestCache) { return new ProviderSignInController(connectionFactoryLocator(), usersConnectionRepository(), new SimpleSignInAdapter(requestCache));}
Sunday, December 9, 12
![Page 85: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/85.jpg)
Configuration: ProviderSignInController
§Performs a similar flow as ConnectController§Compares connections (by user ID)§ If there’s a match, the user is signed into the application§Otherwise, the user is sent to signup page• Connection is be established after signup
63
@Beanpublic ProviderSignInController providerSignInController( RequestCache requestCache) { return new ProviderSignInController(connectionFactoryLocator(), usersConnectionRepository(), new SimpleSignInAdapter(requestCache));}
Sunday, December 9, 12
![Page 86: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/86.jpg)
Configuration: ProviderSignInController
§Performs a similar flow as ConnectController§Compares connections (by user ID)§ If there’s a match, the user is signed into the application§Otherwise, the user is sent to signup page• Connection is be established after signup
63
@Beanpublic ProviderSignInController providerSignInController( RequestCache requestCache) { return new ProviderSignInController(connectionFactoryLocator(), usersConnectionRepository(), new SimpleSignInAdapter(requestCache));}
Sunday, December 9, 12
![Page 87: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/87.jpg)
Configuration: ProviderSignInController
§Performs a similar flow as ConnectController§Compares connections (by user ID)§ If there’s a match, the user is signed into the application§Otherwise, the user is sent to signup page• Connection is be established after signup
63
@Beanpublic ProviderSignInController providerSignInController( RequestCache requestCache) { return new ProviderSignInController(connectionFactoryLocator(), usersConnectionRepository(), new SimpleSignInAdapter(requestCache));}
Sunday, December 9, 12
![Page 88: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/88.jpg)
ProviderSignInController Endpoints
§POST /signin/{provider}• Initiates the authorization flow, redirecting to the provider
§GET /signin/{provider}?oauth_token={token}• Handles an OAuth 1 callback
§GET /signin/{provider}?code={authorization code}• Handles an OAuth 2 callback
§GET /signin• Handles a callback when no oauth token or code is sent
• Likely indicates that the user declined authorization
64
Sunday, December 9, 12
![Page 89: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/89.jpg)
NOT CONFIDENTIAL -- TELL EVERYONE
Spring Security OAuth
65
Sunday, December 9, 12
![Page 90: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/90.jpg)
§Extension to Spring Security• originally a community contribution (now officially part of the project)
§Features...• endpoint management for OAuth service types
• (along with corresponding client management)
• token management (persistence, authentication)
• integrations for the web, as well as through standard Spring Security
§ springsource.org/spring-security/oauth
66
Spring Security OAuth
Sunday, December 9, 12
![Page 91: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/91.jpg)
Setup Spring Security with Spring MVC...
67
<http access-denied-page="/login.jsp" xmlns="http://www.springframework.org/schema/security">
<form-login authentication-failure-url="/login.jsp" default-target-url="/index.jsp" login-page="/login.jsp" login-processing-url="/login.do" />
<logout logout-success-url="/index.jsp" logout-url="/logout.do" />
<anonymous />
<intercept-url pattern="/sparklr/**" access="ROLE_USER" />
<custom-filter ref="oauth2ClientFilter" after="EXCEPTION_TRANSLATION_FILTER" />
</http>
Sunday, December 9, 12
![Page 92: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/92.jpg)
Then Tell Spring Security About Our OAuth Endpoints
68
<authentication-manager xmlns="http://www.springframework.org/schema/security">
<authentication-provider> <user-service>
<user name="marissa" password="wombat" authorities="ROLE_USER" />
<user name="sam" password="kangaroo" authorities="ROLE_USER" />
</user-service> </authentication-provider></authentication-manager>
<oauth:client id="oauth2ClientFilter" redirect-on-error="${redirectOnError:false}" />
<oauth:resource id="sparklr" type="authorization_code" client-id="tonr" client-secret="secret" access-token-uri="${accessTokenUri}" user-authorization-uri="${userAuthorizationUri}" scope="read" />
Sunday, December 9, 12
![Page 93: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/93.jpg)
Then get an Instance of a RestTemplate for the client...
69
<bean class="org.springframework.security.oauth2.client.OAuth2RestTemplate"> <constructor-arg ref = “sparklr”/></bean>
Sunday, December 9, 12
![Page 94: Multi Client Development with Spring - Huihoodocs.huihoo.com/.../multi-client-development-with-spring-en.pdf · Multi Client Development with Spring Josh Long ... Wicket, Vaadin,](https://reader031.vdocuments.site/reader031/viewer/2022022409/5aebf21f7f8b9ab24d8f6f23/html5/thumbnails/94.jpg)
And The REST of it
• Spring Data REST - exposes (JPA, MongoDB, GemFire, Neo4J, Redis) repositories built on Spring Data repositories • Spring HATEOAS - take your REST-fu to the next level with support for HTTP as the engine of application state
Sunday, December 9, 12