`
raymond.chen
  • 浏览: 1436858 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Flex + GraniteDS + Spring + SpringSecurity的整合

阅读更多

一、web.xml文件的配置

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>
		/WEB-INF/config/applicationContext*.xml
	</param-value>
</context-param>

<context-param>
	<param-name>graniteConfigPath</param-name>
	<param-value>/WEB-INF/granite/granite-config.xml</param-value>
</context-param>

<context-param>
	<param-name>servicesConfigPath</param-name>
	<param-value>/WEB-INF/flex/services-config.xml</param-value>
</context-param>



<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<listener>
	<listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class>
</listener>

<listener>
	<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
 </listener>
 
<listener>
	<listener-class>org.granite.config.GraniteConfigListener</listener-class>
</listener>



<!-- SpringSecurity框架的过滤器 -->
<filter>
	<filter-name>springSecurityFilterChain</filter-name>
	<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
	<filter-name>springSecurityFilterChain</filter-name>   
	<url-pattern>/*</url-pattern>   
</filter-mapping>



<!-- GraniteDS框架的过滤器 -->
<filter>
	<filter-name>AMFMessageFilter</filter-name>
	<filter-class>org.granite.messaging.webapp.AMFMessageFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>AMFMessageFilter</filter-name>
	<url-pattern>/graniteamf/*</url-pattern>
</filter-mapping>



<!-- Servlet -->
<servlet>
	<servlet-name>AMFMessageServlet</servlet-name>
	<servlet-class>org.granite.messaging.webapp.AMFMessageServlet</servlet-class>
	<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
	<servlet-name>AMFMessageServlet</servlet-name>
	<url-pattern>/graniteamf/*</url-pattern>
</servlet-mapping>

 

二、services-config.xml文件的配置

<services-config>
	<services>
        <service id="granite-service" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage">
		    <default-channels>
		        <channel ref="my-graniteamf"/>
		    </default-channels>
    		
		    <destination id="securityService">
		    	<properties>
		    		<factory>spring</factory>
		    		<source>securityService</source>
		    	</properties>
		    </destination>
		</service> 
    </services>
    
    <factories>
        <factory id="spring" class="org.granite.spring.SpringServiceFactory"/>
    </factories>
    
    <channels>
        <channel-definition id="my-graniteamf" class="mx.messaging.channels.AMFChannel">
            <endpoint uri="http://{server.name}:{server.port}/{context.root}/graniteamf/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-definition>
    </channels>
</services-config>

 

三、granite-config.xml文件的配置

<!DOCTYPE granite-config PUBLIC "-//Granite Data Services//DTD granite-config internal//EN" "http://www.graniteds.org/public/dtd/2.0.0/granite-config.dtd">
<granite-config>
	<security type="org.granite.messaging.service.security.SpringSecurityService"/>
</granite-config>

 

四、applicationContext.xml文件的配置

<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
	
	 <bean id="securityService" class="com.achievo.web.service.SecurityServiceImpl"/>
 
</beans>

 

五、applicationContext-security.xml文件的配置

<b:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:b="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.4.xsd">
	
    <http auto-config="true" lowercase-comparisons="false" path-type="ant"
    	access-decision-manager-ref="accessDecisionManager" access-denied-page="/index.html">
    	<intercept-url pattern="/index.html*" filters="none"/>
    	<intercept-url pattern="/**/*.css*" filters="none"/>
    	<intercept-url pattern="/**/*.js*" filters="none"/>
        <intercept-url pattern="/**/*.swf*" filters="none"/>
        <intercept-url pattern="/graniteamf/amf*" filters="none"/>
        
        <intercept-url pattern="/**" access="ADMIN"/>
    	
        <form-login login-page="/index.html" authentication-failure-url="/index.html"/>
        <logout logout-success-url="/index.html" invalidate-session="true"/>
        <concurrent-session-control max-sessions="1" exception-if-maximum-exceeded="false" expired-url="/index.html"/>
        <remember-me />
    </http>
	
	<!-- 方法级安全配置 -->
	<global-method-security access-decision-manager-ref="accessDecisionManager" secured-annotations="enabled" jsr250-annotations="enabled">
		<protect-pointcut expression="execution(* com.achievo.web.service..*.*(..))" access="ADMIN"/>
	</global-method-security>
	
	<b:bean id="accessDecisionManager" class="org.springframework.security.vote.AffirmativeBased">
		<b:property name="allowIfAllAbstainDecisions" value="false"/>
		<b:property name="decisionVoters">
			<b:list>
				<b:bean class="org.springframework.security.vote.RoleVoter">
					<b:property name="rolePrefix" value=""/>
				</b:bean>
			</b:list>
		</b:property>
	</b:bean>
	
	<authentication-provider>
		<user-service>
			<user name="admin" password="admin" authorities="ADMIN"/>
            <user name="user" password="user" authorities="USER"/>
		</user-service>
	</authentication-provider>
</b:beans>

 

六、java类源码

public interface SecurityService {
	public String[] getUserRoles();
}


public class SecurityServiceImpl implements SecurityService {
	public String[] getUserRoles(){
		Authentication auth = SecurityContextHolder.getContext().getAuthentication();
		GrantedAuthority[] ga = SecurityContextHolder.getContext().getAuthentication().getAuthorities();
		String[] roles = new String[ga.length];
		for(int i=0;i<ga.length;i++){
			roles[i] = ga[i].getAuthority();
		}
		return roles;
	}
}

 

七、mxml文件源码

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init()">
	<mx:Script>
		<![CDATA[
			import mx.messaging.Channel;
			import mx.messaging.ChannelSet;
			import mx.controls.Alert;
			import org.granite.events.SecurityEvent;
			import org.granite.rpc.remoting.mxml.SecureRemoteObject;
			import com.achievo.flex.common.StringUtils;
			import mx.rpc.Fault;
			import mx.rpc.events.FaultEvent;
			import mx.rpc.events.ResultEvent;
			
			private var roles:Array;
			private var src:SecureRemoteObject = null;
			
			private function init():void{
				src = new SecureRemoteObject("securityService");
				src.showBusyCursor = true;
				src.addEventListener(ResultEvent.RESULT, resultHandler);
				src.addEventListener(FaultEvent.FAULT, faultHandler);
				src.addEventListener(SecurityEvent.ALL, securityHandler);
				
				username.setFocus();
				btnLogout.enabled = false;
			}
			
			private function login():void{
				btnLogin.enabled = false;
				try{
					src.setCredentials(username.text, password.text, "UTF-8");
					src.getOperation("getUserRoles").send();
				}catch(ex:Error){
					errorMsg.text = "getUserRoles error: " + ex.toString();
				}
			}
			
			private function logout():void{
				src.logout();
				errorMsg.text = "";
				username.text = "";
				password.text = "";
				btnLogin.enabled = true;
				btnLogout.enabled = false;
				username.setFocus();
			}
			
			private function resultHandler(e:ResultEvent):void{
				errorMsg.text = "用户角色: " + e.result;
				btnLogin.enabled = false;
				btnLogout.enabled = true;
			}
			
			private function faultHandler(e:FaultEvent):void{
				var fault:Fault = e.fault;
				var s:String = (fault.faultDetail!=null) ? fault.faultDetail : fault.faultString;
				errorMsg.text = "faultHandler: " + s;
				btnLogin.enabled = true;
			}
			
			private function securityHandler(e:SecurityEvent):void{
				switch(e.type){
	                case SecurityEvent.INVALID_CREDENTIALS:
	                	src.logout();
	                    errorMsg.text = "用户名或者密码不正确";
                		btnLogin.enabled = true;
	                    break;
	                case SecurityEvent.NOT_LOGGED_IN:
	                	src.logout();
	                    errorMsg.text = "尚未登录";
                		btnLogin.enabled = true;
	                    break;
	                case SecurityEvent.SESSION_EXPIRED:
	                	src.logout();
	                    errorMsg.text = "Session过期";
                		btnLogin.enabled = true;
	                    break;
	                case SecurityEvent.ACCESS_DENIED:
	                	src.logout();
	                    errorMsg.text = "没有访问权限";
                		btnLogin.enabled = true;
	                    break;
                }
			}
		]]>
	</mx:Script>

	<mx:Panel id="p1" x="159" y="58" horizontalCenter="0" verticalCenter="0" width="359" height="332" layout="absolute" title="系统登录" fontSize="12">
		<mx:VBox width="100%">
			<mx:Form id="form1" x="0" y="0" width="100%" defaultButton="{btnLogin}">
				<mx:FormItem label="用户名" width="100%">
					<mx:TextInput id="username"/>
				</mx:FormItem>
				<mx:FormItem label="密  码" width="100%">
					<mx:TextInput id="password" displayAsPassword="true"/>
				</mx:FormItem>
			</mx:Form>
			
			<mx:HBox horizontalAlign="center" width="100%" horizontalGap="19">
				<mx:Button id="btnLogin" label="登录" click="login()"/>
				<mx:Button label="注销" id="btnLogout" click="logout()"/>
			</mx:HBox>
		</mx:VBox>
		<mx:Text x="10" y="136" width="319" height="111" id="errorMsg"/>
	</mx:Panel>
</mx:Application>

 

2
0
分享到:
评论
1 楼 YRHYRH 2009-12-23  
import com.achievo.flex.common.StringUtils;

提示错误啊,少了什么东西?

相关推荐

    Flex+spring+hibernate整合视频学习交流part_2

    2. **Flex与Spring的通信**:介绍 BlazeDS 或 GraniteDS 等中间件,它们作为Flex和Spring应用之间的桥梁,处理AMF(Action Message Format)消息的传输,使得Flex客户端可以调用后端的Spring服务。 3. **Flex的数据...

    flex + spring 项目

    《Flex + Spring 项目:构建前端与后端的无缝整合》 在当今的软件开发领域,前端用户界面的交互性和后端服务的高效性是关键因素。Flex 和 Spring 框架的结合,为开发者提供了构建强大且灵活的Web应用程序的理想解决...

    flex+java前后台通讯

    Flex与Java的通信机制基于 BlazeDS 或 GraniteDS 等中间件,它们提供了AMF协议,实现了高效的二进制数据传输。理解这一过程对于构建高性能、响应式的Web应用至关重要。通过合理的项目配置、事件监听和异常处理,我们...

    (XF - 8)Flex + Spring

    标题 "(XF - 8)Flex + Spring" 暗示了这个主题是关于整合Adobe Flex与Spring框架的。在Web开发中,Flex通常用于构建富互联网应用程序(RIA),而Spring是一个广泛使用的Java后端框架,它提供了依赖注入、AOP(面向...

    flex+jfreechart+others 整合架包和配置

    在"flex+jfreechart+others"的整合中,我们通常指的是将Flex前端的交互性和数据展示能力与JFreeChart后端的数据可视化功能相结合。这涉及到以下几个关键知识点: 1. **数据通信**:Flex应用通常通过AMF(Action ...

    FLex+java 通讯

    SSL/TLS用于加密传输,Spring Security或Apache Shiro等库可以用于Java端的身份验证和授权。 压缩包内的“Flex+Java.pdf”很可能详细阐述了以上提到的通信技术,包括配置步骤、代码示例和最佳实践。...

    flex+servlet简单实例

    例如,可以使用BlazeDS或 GraniteDS这样的服务来提供AMF支持。这些服务允许Servlet容器处理AMF请求,与Flex客户端进行交互。 4. **数据交换**:在Flex客户端与Servlet之间,可以通过Flex的HTTPService或WebService...

    flex3 + java + spring + jasperreports 开发框架

    "flex3 + java + spring + jasperreports" 是一种常见的组合,用于创建具有丰富用户界面、高效后端处理和强大报表功能的应用。以下将详细讲解这些技术及其在开发中的应用。 **Flex 3**: Flex 3 是Adobe开发的一款...

    flex整合spring的例子

    整合Flex和Spring,主要通过 BlazeDS 或 GraniteDS 这样的中间件来实现。BlazeDS 是 Adobe 提供的一个开源项目,它提供了一套服务器端组件,允许Flex客户端与Spring服务进行AMF(Action Message Format)通信。AMF是...

    flex + ssh框架 结合例子

    使用 BlazeDS 或 GraniteDS 这样的中间件,可以轻松实现Flex与Spring的AMF集成。 2. **Spring集成**:Spring可以作为服务层,提供业务接口。在Flex中,通过HTTPService或WebService调用这些接口,实现客户端与...

    Flex+Java Servlet文件上传实例

    这两个JAR可能包含了与Flex通信的库,如 BlazeDS 或 GraniteDS,它们提供了AMF(Action Message Format)协议支持,使得Flex和Java之间能高效地交换数据。另一个JAR可能是Servlet相关的库,如Apache Tomcat或Jetty...

    Flex + Java 最佳实例(附工程)

    使用 BlazeDS 或 GraniteDS 等中间件,可以轻松建立Flex前端与Java后端之间的通信桥梁。 四、学习资源——FlexClass 在提供的压缩包中,“FlexClass”可能是包含一个或多个示例项目,这些项目展示了如何在Flex中...

    Flex + LCDS + J2EE 传值交互实例

    它提供了数据推送、实时数据共享和高级数据服务,如BlazeDS和 GraniteDS。 3. J2EE(Java Platform, Enterprise Edition):这是一个用于开发和部署企业级应用程序的开放标准平台,包括Java Servlets、JavaServer ...

    flex+Struts实例

    需要熟悉 BlazeDS 或 GraniteDS 这样的AMF服务器,它们提供与Struts的集成。 4. **服务端Action**:创建处理前端请求的服务端Action,定义方法来处理来自Flex的请求,并返回所需的数据或执行业务逻辑。 5. **数据...

    Flex实战-puremvc+java(spring+hibernate)实现增删改查操作

    Flex和Java之间的通信通常通过 BlazeDS 或 GraniteDS 这样的服务器中间件实现。它们提供AMF协议,能高效地传输数据,减少网络延迟,同时提供了类型安全的数据交换。 7. **最佳实践**: 在开发此类应用时,应遵循...

    flex+struts

    通常会使用 BlazeDS 或 GraniteDS 这样的中间件来建立Flex与Struts之间的通信通道,这些中间件支持AMF(Action Message Format),这是一种高效的二进制协议,可以快速传输数据。 4. **AMF通信**:AMF是一种轻量级...

    flex java 项目整合.rar

    GraniteDS同样支持AMF协议,并且可以与Spring框架无缝集成,简化Java服务的暴露和调用。在Flex客户端,使用 GraniteDS的ProxyService可以方便地访问Java服务。 3. ** HTTP/RESTful服务 **:如果不愿意使用AMF,Flex...

    spring-flex-1.0.3.zip

    通过Spring BlazeDS Integration或 GraniteDS,Spring Flex能够将Spring Bean直接暴露为Flex服务,使得客户端可以直接调用后端服务,实现数据的实时更新。 **Flex 4的应用** Flex 4,也被称为Spark,是Flex框架的...

    flex spring

    1. **Flex与Spring的集成**:这涉及到使用 BlazeDS 或 GraniteDS 等中间件来建立Flex与Spring之间的通信通道,使得Flex能够调用Spring服务,处理数据请求。 2. **Spring配置**:设置Spring的bean定义,包括数据源、...

Global site tag (gtag.js) - Google Analytics